У меня есть проблема, с которой я не могу справиться.
Когда я использую EnumerateFiles, он не возвращает файлы, хотя я знаю, что должно быть более 3 тыс. результатов.
Мой код выглядит так:
private IEnumerable<string> TestGetFiles(string path, params string[] exts)
{
var extsAsWildcards = exts.Select(x => "*." + x).ToArray();
return exts.Select(x => "*." + x) .SelectMany(x => Directory.EnumerateFiles(path, x));
}
Я взял этот код отсюда: ссылка на Git
Ни одно из решений не работает, и мне нужно это решение для нескольких расширений. Единственный метод, который работал для меня, это:
private IEnumerable<string> GetCurrentFontFiles(string item)
{
IEnumerable<string> files = Directory.EnumerateFiles(item + Path.DirectorySeparatorChar, "*.ttf", SearchOption.AllDirectories).ToArray();
return files;
}
Который работает, но только для одного расширения.
Пожалуйста, помогите мне, ребята, я не хочу использовать GetFiles, который очень медленный (у меня более 10 тысяч файлов в папке).
EDIT1 Я вызываю метод с этим фильтром:
string[] extensions = {"png"};
ИЗМЕНИТЬ2
Мой пример для воспроизведения:
private IEnumerable<string> TestGetFiles(string path, params string[] exts)
{
return exts.Select(x => "*." + x).SelectMany(x => Directory.EnumerateFiles(path, x));
}
private List<FileSizeList> GetPNGFiles(string pathForFiles)
{
List<FileSizeList> PNGFiles = new List<FileSizeList>();
string[] extensions = {"png"};
IEnumerable<string> files = TestGetFiles(pathForFiles, extensions);
foreach (var file in files)
{ //no iteration here
}
}
EDIT3 Рабочее решение
Я знаю, где была проблема. Я изменил код и добавил отсутствующий SearchOption
private IEnumerable<string> TestGetFiles(string path, params string[] exts)
{
var extensions = exts
.Select(x => x.StartsWith(".") ? x : "." + x)
.ToArray();
return Directory.EnumerateFiles(path,"*.*",SearchOption.AllDirectories)
.Where(fn => extensions.Contains(Path.GetExtension(fn), StringComparer.InvariantCultureIgnoreCase));
}
exts
уже содержит.
. Вы должны показать пример. Сколько расширений вы фильтруете? - person Tim Schmelter   schedule 30.10.2015foo.bar.txt
? Или вы хотите перечислить все*.txt
и все*.jpg
файлы? Можете ли вы показать несколько примеров имен файлов и пример ввода для этого метода? - person CodeCaster   schedule 30.10.2015Directory.EnumerateFiles
, что произойдет, если вы объедините их? - person   schedule 30.10.2015return extsAsWildcards.Select(...)
, дважды добавляя*.
? Создайте минимально воспроизводимый пример. - person CodeCaster   schedule 30.10.2015