Directory.GetFiles возвращает неожиданные результаты с SearchPattern

Я работаю над пакетной программой, которая обрабатывает большое количество файлов (более 50 000 файлов), и сталкиваюсь со странным поведением с Directory.GetFiles метод.

В процессе я перемещаю файлы, которые соответствуют следующему шаблону поиска "*.pdf", и получаю файлы благодаря Directory.GetFiles Метод: Я был очень удивлен, увидев, что иногда я перемещаю файлы.pdfa.

Итак, я проверил документ, и в нем четко указано, что если шаблон поиска содержит расширение с 3 буквами, будут возвращены все файлы с расширением, которое начинается с расширения.

Я тестировал с простой программой, и она не ведет себя так, как указано в документе, она ведет себя так только в очень редких случаях.

С этим кодом:

static void Main(string[] args) {
    var directory = @"E:\Test\";
    var files = Directory.GetFiles(directory, "*.pdf");
    foreach(var file in files)
        Console.WriteLine(file);
}

У меня есть такой результат:

введите описание изображения здесь

Есть ли у вас какие-либо объяснения по поводу этого поведения?

2 ответа

Это ожидаемое поведение метода GetFiles и то же самое в Windows. Если вы будете искать в каталоге с .pdf, он выберет файлы с расширениями.pdfa или *.pdfaaa, вам нужно будет поставить Where() себя как:

Directory.GetFiles(directory, "*.pdf").Where(item => item.EndsWith(".pdf"));

Как вы можете видеть, когда мы ищем в окнах, он дает тот же результат, что и ваш код:

По причине того, почему GetFiles ведет себя так, пожалуйста, посмотрите здесь, и вы также можете посмотреть этот пост.

Как объяснили @luaan и @hans-passant (большое спасибо!), Я не нашел файл с расширением.pdfa, потому что на моем жестком диске отключен формат 8.3.

На жестком диске с включенным форматом 8.3 метод ведет себя так, как указано в документе.

GetFiles имеет другое поведение с включенным параметром или нет.

Другие вопросы по тегам