Смутно о 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
                }
            }