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

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

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

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

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

С этим кодом:

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

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

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

У вас есть какое-то объяснение этому поведению?


person PatriceVB    schedule 23.02.2017    source источник
comment
Это нормальное несчастье. Это действительно долго в зубах, но тома файловой системы сегодня по-прежнему регулярно включают поддержку имен DOS 8.3. Таким образом, файл verylongname.pdfa превращается в файл verylo~1.pdf, и шаблон поиска будет соответствовать ему. Требуется постфильтрация.   -  person Hans Passant    schedule 23.02.2017
comment
Как вы можете видеть в результате на скриншоте, НЕТ. На скриншоте видно, что файла .pdfa НЕТ на выходе.   -  person PatriceVB    schedule 23.02.2017
comment
Как объяснил Ханс, он будет делать это, когда есть альтернативные имена для файла, которые имеют только трехбуквенное расширение, как в именах, совместимых с MS-DOS 8.3. В вашем примере файл явно не имеет имени 8.3, поэтому он не соответствует.   -  person Luaan    schedule 23.02.2017
comment
Чувак, не кричи на меня. Вместо этого введите dir /x и кричите на то, что видите.   -  person Hans Passant    schedule 23.02.2017
comment
Я не кричал на тебя, извини, если ты подумал, что я кричал. Вот выдержка из результата: E:\Test›dir /X Répertoire de E:\Test 01.04.2017 13:15 706 333 349739_09000010.pdf 01.12.2017 13:47 370 971 349739_09000010.pdfa   -  person PatriceVB    schedule 23.02.2017
comment
Добавьте его в вопрос, а не в комментарий. Но в любом случае очевидно, что у файлов 8.3 нет названий - иначе бы их показывали :)   -  person Luaan    schedule 23.02.2017
comment
Хорошо, нашел, благодаря вашей помощи и помощи luaan, я понял, что формат 8.3 отключен на диске, на котором я тестировал свой код. Спасибо большое за вашу помощь ! :)   -  person PatriceVB    schedule 23.02.2017


Ответы (2)


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

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

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

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

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

person Ehsan Sajjad    schedule 23.02.2017
comment
Как видно на скриншоте ЭТО НЕТ!! У меня НЕТ файла .pdfa на выходе - person PatriceVB; 23.02.2017
comment
Весь смысл вопроса в том, что он не всегда делает это. *.pdf будет соответствовать только расширению, которое точно соответствует pdf, а не pdfa. Однако, если у вас есть имя 8.3, связанное с этим файлом, вы получите файл .pdfa, потому что его имя 8.3 имеет только расширение pdf, а не pdfa. - person Luaan; 23.02.2017
comment
Что вы имеете в виду, если у вас есть имя 8.3, связанное с этим файлом? Я думаю, что с каждым файлом связано имя 8.3, я ошибаюсь? - person PatriceVB; 23.02.2017
comment
@PatriceVB Если у вас NTFS, ее можно отключить (support.microsoft.com/en-us/help/121007/). В других файловых системах правила могут быть совершенно другими (компакт-диски, FAT, общие сетевые ресурсы, доп...). - person Luaan; 23.02.2017

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

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

GetFiles ведет себя по-разному, независимо от того, включен этот параметр или нет.

person PatriceVB    schedule 23.02.2017