Directory.getfiles(): конкретные имена файлов С#

Я пытался:

  • Прочитать все файлы из определенной папки;
  • Выберите только те, которые заканчиваются на определенное имя шаблона + .csv

Что у меня есть на данный момент:

                string[] fileEntriesout = System.IO.Directory.GetFiles(dir + "\\" + "output\\", "*.csv*", System.IO.SearchOption.AllDirectories);

Это работает хорошо, но получает все файлы .CSV;

Что я пробовал:

                string[] extensions = { "_fv", "_body", "_out" };
            string[] fileEntriesout = Directory.GetFiles(dir + "\\" + "output\\", "*.csv*", System.IO.SearchOption.AllDirectories).Where(f => extensions.Contains(System.IO.Path.GetFileNameWithoutExtension(f).ToLower())).ToArray();
            string[] fileEntriesout = System.IO.Directory.GetFiles(dir + "\\" + "output\\", "*.*", System.IO.SearchOption.AllDirectories).Where(f => nextensions.Contains(new FileInfo(f).Extension.ToLower())).ToArray();
            string[] fileEntriesout = System.IO.Directory.GetFiles(dir + "\\" + "output\\", "*.*", System.IO.SearchOption.AllDirectories).Where(f => nextensions.Contains(new FileInfo(f).Name.ToLower())).ToArray();
            string[] fileEntriesout = System.IO.Directory.GetFiles(dir + "\\" + "output\\", "*.*", System.IO.SearchOption.AllDirectories).Where(f => nextensions.Contains(new FileInfo(f).Extension.ToLower())).ToArray();

Я пробовал разные идеи, которые я нашел, но ни одна из них не работает.

Подводя итог:

  1. Мне нужно, чтобы string[] получал все файлы .CSV, которые содержат (обычно в конце имени файла) имена: «_fv» или «_body» или «_out».

Спасибо.


c#
person Fabio Soares    schedule 14.06.2017    source источник
comment
Когда вы формируете пути, используйте метод Path.Combine. Вы предполагаете, что по умолчанию разделителем путей является символ `\`.   -  person dcg    schedule 14.06.2017


Ответы (1)


Используйте LINQ и EnumerateFiles вместо GetFiles + Path.GetFilenameWithoutExtension:

string[] extensions = { "_fv", "_body", "_out" };
string[] fileEntriesout = System.IO.Directory.EnumerateFiles(dir + "\\" + "output\\", "*.csv", System.IO.SearchOption.AllDirectories)
    .Where(file => extensions.Any(ex => Path.GetFileNameWithoutExtension(file).EndsWith(ex)))
    .ToArray();

String.EndsWith имеет перегрузку, которая требует StringComparison, если вы хотите игнорировать регистр (например, разрешить _Body тоже):

EndsWith(ex, StringComparison.InvariantCultureIgnoreCase)
person Tim Schmelter    schedule 14.06.2017
comment
Это работает! Единственное изменение, которое я сделал, было: Path.GetFilenameWithoutExtension на Path.GetFileNameWithoutExtension (верхний регистр N) Спасибо! - person Fabio Soares; 14.06.2017