Directory.GetFiles的某些扩展名

XSL*_*XSL 50 c# linq directory getfiles

有没有办法简化这个linq表达式,还是有更好的方法来做到这一点?

Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
         .Where(s => s.EndsWith(".jpg", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".gif", StringComparison.OrdinalIgnoreCase) ||
                     s.EndsWith(".png", StringComparison.OrdinalIgnoreCase) ||
                     ...);
Run Code Online (Sandbox Code Playgroud)

基本上我想返回某个扩展名的所有文件.不幸的是,这种方法不是很灵活.我宁愿能够在列表中添加扩展名,并让Directory.GetFiles返回这些扩展名.那可能吗?

das*_*ght 97

如果您想在LINQ中进行过滤,可以这样做:

var ext = new List<string> {".jpg", ".gif", ".png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
     .Where(s => ext.Contains(Path.GetExtension(s)));
Run Code Online (Sandbox Code Playgroud)

现在ext包含允许的扩展名列表; 您可以根据需要添加或删除项目以进行灵活过滤.

  • 注意:这似乎不适用于运行 .NET 4.5 的 Win7 x64。由于管道而抛出“路径中的非法字符”。 (2认同)
  • 对于路人的注意事项:你可能会从@ nekizalb的回答中提到的新的.NET 4.0`Direct.EnumerateFiles`中获得性能提升 (2认同)

Tyl*_*Lee 14

Directory.GetFiles(String, String)过载是否已经这样做了?你会做的Directory.GetFiles(dir, "*.jpg", SearchOption.AllDirectories)

如果要将它们放在列表中,则只需将"*.jpg"迭代替换为列表的变量,并将结果聚合到整个结果集中.比单独指定它们要清楚得多.=)

就像是...

foreach(String fileExtension in extensionList){
    foreach(String file in Directory.GetFiles(dir, fileExtension, SearchOption.AllDirectories)){
        allFiles.Add(file);
    }
}
Run Code Online (Sandbox Code Playgroud)

(如果您的目录很大,使用EnumerateFiles而不是GetFiles可能更有效)

  • 请注意这样一个事实,即使用通配符*时,总是有可能弄乱预期的逻辑.例如,您有两个文件Test1.xls和Test2.xlsx,如果您使用filter*.xls过滤掉xls文件,Directory.GetFiles**将返回xls和xlsx文件**.[阅读MSDN了解更多信息]:http://msdn.microsoft.com/en-us/library/ms143316%28v=vs.110%29.aspx (4认同)

小智 5

我会只用单行完成

List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
      .Where(file => new string[] { ".jpg", ".gif", ".png" }
      .Contains(Path.GetExtension(file)))
      .ToList();
Run Code Online (Sandbox Code Playgroud)

  • 这当然有效,但是您传递给 `.Where()` 的 lambda 表达式将创建一个 `string[]` [每次调用时](/sf/ask/2737427661/常量但本地数组);也就是说,对于 `dir` 下的每个文件。例如,如果`dir` 是`@"C:\"`,那么这可能会创建数万或数十万个短期“垃圾”数组。我绝对认为在`.Where()`之外定义数组是值得的,即使这意味着必须编写可怕的第二行代码。 (4认同)