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 вернет эти расширения. Возможно ли это?
Ответы
Ответ 1
Если вы хотите сделать свою фильтрацию в LINQ, вы можете сделать это следующим образом:
var ext = new List<string> {"jpg", "gif", "png"};
var myFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(s => ext.Contains(Path.GetExtension(s)));
Теперь ext
содержит список разрешенных расширений; вы можете добавлять или удалять элементы, необходимые для гибкой фильтрации.
Ответ 2
Не делает ли это перегрузка 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
потенциально может быть более эффективным)
Ответ 3
Я бы использовал только одну строку, например
List<string> imageFiles = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories)
.Where(file => new string[] { ".jpg", ".gif", ".png" }
.Contains(Path.GetExtension(file)))
.ToList();