C# 获取windows 8 store/metro应用程序中某些文件扩展名的所有路径

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();

问题

我想在WINDOWS 8应用商店(TABLET)应用程序中获取文件夹中具有“自定义”文件扩展名(.pssm和.pnsm)的文件的所有路径,以及其每个子文件夹的路径(深度搜索)


步骤

  • 使用
    文件夹选择器选择父文件夹
    ,并保存文件夹路径字符串

    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;
        }
    }
    
  • 在以前保存的文件夹路径字符串及其子文件夹下搜索扩展名为.pssm或.pnsm的所有文件


  • 问题

    如何执行步骤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();
        }