Directory.GetFiles的某些扩展名

时间:2012-11-09 02:00:59

标签: 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) ||
                     ...);

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

3 个答案:

答案 0 :(得分:91)

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

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

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

答案 1 :(得分:13)

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

(如果您的目录很大,使用EnumerateFiles代替GetFiles可能会更有效率)

答案 2 :(得分:4)

我会像

一样使用单行
List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
      .Where(file => new string[] { ".jpg", ".gif", ".png" }
      .Contains(Path.GetExtension(file)))
      .ToList();
相关问题