Смутно о Directory.GetFiles
Я прочитал документы о шаблоне поиска Directory.GetPath
и том, как он используется, потому что я заметил, что *.dll
находит как test.dll
, так и test.dll_20170206
. Это поведение документировано
Теперь у меня есть программа, которая перечисляет файлы в папке на основе настроенной пользователем маски и обрабатывает их. Я заметил, что маски вроде *.txt
приводят к вышеупомянутой "проблеме", как ожидалось.
Однако маска fixedname.txt
также вызывает появление fixedname.txt_20170206
или тому подобное в списке, хотя в документации указано, что это происходит только
Когда вы используете символ подстановки звездочки в searchPattern, такой как "*.txt"
Почему?
PS: Я только что проверил: изменение маски файла на fixednam?.txt
не помогает, даже если документы говорят
При использовании символа подстановки вопросительного знака этот метод возвращает только файлы, соответствующие указанному расширению файла. Например, в двух файлах "file1.txt" и "file1.txtother" в каталоге шаблон поиска "file?.txt" возвращает только первый файл, тогда как шаблон поиска "file *.txt" возвращает оба файла.
Ответы
Ответ 1
Если вам нужно решение, вы можете преобразовать шаблон фильтра в регулярное выражение, заменив *
на (.*)
и ?
на .
. Вы также должны избегать некоторых символов шаблонов, таких как точка. Затем вы проверяете каждое имя файла, которое вы получили от Directory.GetFiles
, против этого регулярного выражения. Имейте в виду не только проверить, является ли это совпадением, но и длина совпадения равна длине имени файла. В противном случае вы получите те же результаты, что и раньше.
Ответ 2
GetFiles использует шаблон serach, он ищет все имена в пути, заканчивающемся указанными буквами.
Вы можете написать код, похожий на ниже, чтобы получить только файл расширения .txt
foreach (string strFileName in Directory.GetFiles(@"D:\\test\","*.txt"))
{
string extension;
extension = Path.GetExtension(strFileName);
if (extension != ".txt")
continue;
else
{
//processed the file
}
}