C# 获取windows 8 store/metro应用程序中某些文件扩展名的所有路径
问题 我想在WINDOWS 8应用商店(TABLET)应用程序中获取文件夹中具有“自定义”文件扩展名(.pssm和.pnsm)的文件的所有路径,以及其每个子文件夹的路径(深度搜索)C# 获取windows 8 store/metro应用程序中某些文件扩展名的所有路径,c#,windows-8,windows-store-apps,file-search,C#,Windows 8,Windows Store Apps,File Search,问题 我想在WINDOWS 8应用商店(TABLET)应用程序中获取文件夹中具有“自定义”文件扩展名(.pssm和.pnsm)的文件的所有路径,以及其每个子文件夹的路径(深度搜索) 步骤 使用文件夹选择器选择父文件夹,并保存文件夹路径字符串 private async void BrowseButton_Tapped(object sender, TappedRoutedEventArgs e) { FolderPicker fPicker = new FolderPicker();
步骤
文件夹选择器选择父文件夹
,并保存文件夹路径字符串
private async void BrowseButton_Tapped(object sender, TappedRoutedEventArgs e)
{
FolderPicker fPicker = new FolderPicker();
fPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
fPicker.FileTypeFilter.Add(".pnsm");
fPicker.FileTypeFilter.Add(".pssm");
StorageFolder sFolder = await fPicker.PickSingleFolderAsync();
if (sFolder != null)
{
StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", sFolder);
(DataContext as MainPageVM).ParentFolder = sFolder.Path;
}
}
问题 如何执行步骤2
其他详细信息 这就是我在我的桌面应用程序版本(桌面XAML应用程序,而不是windows 8 one)中的做法,也许它可以用作参考(我不知道如何调整它以适应win 8应用程序)
private async void按钮刷新\u单击(对象发送方,路由目标)
{
//http://www.codeproject.com/Messages/4762973/Nice-article-and-here-is-Csharp-version-of-code-fr.aspx
计数器=0;
字符串s=(DataContext作为MainWindowVM).ParentFolder;
列出exts=(DataContext作为MainWindowVM);
行动进度目标=新行动(报告进度);
searchProgress=新进度(progressTarget);
列出查询路径=
等待任务。运行(()=>GetAllAccessibleFiles(s、exts、searchProgress));
(DataContext作为MainWindowVM)。刷新列表(QueriedPath);
SaveSearch();
progressText.Text+=“(搜索已完成)”;
}
私有列表GetAllAccessibleFiles(
字符串根路径,列表exts,IProgress searchProgress,列表alreadyFound=null)
{
if(alreadyFound==null)
{
alreadyFound=新列表();
}
if(searchProgress!=null)
{
计数器++;
搜索进度。报告(计数器);
}
DirectoryInfo dI=新的DirectoryInfo(rootPath);
var dirs=dI.EnumerateDirectories().ToList();
foreach(目录中的目录信息目录)
{
如果(!((dir.Attributes&FileAttributes.Hidden)=FileAttributes.Hidden))
{
alreadyFound=GetAllAccessibleFiles(dir.FullName、exts、searchProgress、alreadyFound);
}
}
var files=Directory.GetFiles(rootPath);
foreach(文件中的字符串文件)
{
if(exts.Any(x=>file.EndsWith(x)))
{
添加(文件);
}
}
返回已找到的文件;
}
看来我离答案有点近了。我不知道为什么我没有想到。因此,这里是对我的RefreshButton\u点击获取所有路径的更新
private async void RefreshButton_Tapped(object sender, TappedRoutedEventArgs e)
{
StorageFolder sFolder =
await StorageFolder.GetFolderFromPathAsync((DataContext as MainPageVM).ParentFolder);
List<string> fileTypeFilter = new List<string>();
fileTypeFilter.Add(".pnsm");
fileTypeFilter.Add(".pssm");
QueryOptions queryOptions =
new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter);
StorageFileQueryResult results = sFolder.CreateFileQueryWithOptions(queryOptions);
var files = await results.GetFilesAsync();
List<string> paths = files.Select(x => x.Path.ToString()).ToList();
SaveSearch();
}
private async void RefreshButton_点击(对象发送方,点击路由数据源)
{
StorageFolder文件夹=
等待StorageFolder.GetFolderFromPathAsync((DataContext作为MainPageVM.ParentFolder);
List fileTypeFilter=新列表();
fileTypeFilter.Add(“.pnsm”);
fileTypeFilter.Add(“.pssm”);
查询选项查询选项=
新的查询选项(CommonFileQuery.OrderByName、fileTypeFilter);
StorageFileQueryResult results=sFolder.CreateFileQueryWithOptions(queryOptions);
var files=wait results.getFileAsync();
列表路径=文件。选择(x=>x.Path.ToString()).ToList();
SaveSearch();
}
如果有人有更好的答案,请随意回答。使用查询是进行此类搜索的最佳方式;比自己尝试遍历文件夹结构容易得多。@KraigBrockschmidt MSFT有时默认迭代器会命中“不安全”文件夹并返回错误。
private async void RefreshButton_Tapped(object sender, TappedRoutedEventArgs e)
{
StorageFolder sFolder =
await StorageFolder.GetFolderFromPathAsync((DataContext as MainPageVM).ParentFolder);
List<string> fileTypeFilter = new List<string>();
fileTypeFilter.Add(".pnsm");
fileTypeFilter.Add(".pssm");
QueryOptions queryOptions =
new QueryOptions(CommonFileQuery.OrderByName, fileTypeFilter);
StorageFileQueryResult results = sFolder.CreateFileQueryWithOptions(queryOptions);
var files = await results.GetFilesAsync();
List<string> paths = files.Select(x => x.Path.ToString()).ToList();
SaveSearch();
}