earlier SO question 讨论如何检索目录树中与多个扩展名之一匹配的所有文件。

例如。检索 C:\和所有子目录中的所有文件,匹配 *.log、*.txt、*.dat。

接受的答案是这样的:

var files = Directory.GetFiles("C:\\path", "*.*", SearchOption.AllDirectories)
            .Where(s => s.EndsWith(".mp3") || s.EndsWith(".jpg"));

这让我觉得效率很低。如果您正在搜索包含数千个文件的目录树(它使用 SearchOption.AllDirectories),则指定目录树中的每个文件都会加载到内存中,然后才会删除不匹配项。 (让我想起 ASP.NET 数据网格提供的“分页”。)

不幸的是,标准的 System.IO.DirectoryInfo.GetFiles 方法一次只接受一个过滤器。

这可能只是我缺乏 Linq 知识,我提到的方式实际上效率低下吗?

其次,有没有更有效的方法可以在有和没有 Linq 的情况下(无需多次调用 GetFiles)?

最佳答案

我分享了您的问题,我在 excellent post 的 Matthew Podwysocki 的 codebetter.com 中找到了解决方案。

他使用 native 方法实现了一个解决方案,允许您在他的 GetFiles 实现中提供一个谓词。此外,他使用 yield 语句实现了他的解决方案,有效地将每个文件的内存使用率降至绝对最低。

使用他的代码,您可以编写如下内容:

var allowedExtensions = new HashSet<string> { ".jpg", ".mp3" };

var files = GetFiles(
    "C:\\path",
    SearchOption.AllDirectories,
    fn => allowedExtensions.Contains(Path.GetExtension(fn))
);

并且 files 变量将指向一个枚举器,该枚举器返回匹配的文件(延迟执行样式)。

关于c# - 高效检索和过滤文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/541181/

10-11 06:22
查看更多