#c# #.net #file #search #design-patterns
#c# #.net #библиотека базового класса #system.io.directory
Вопрос:
Я работаю над пакетной программой, которая обрабатывает большое количество файлов (более 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);
}
У меня есть этот результат :
У вас есть какое-либо объяснение такого поведения?
Комментарии:
1. Это обычная ошибка. Это действительно затягивает, но тома файловой системы сегодня все еще обычно поддерживают имена DOS 8.3. Таким образом, verylongname.pdfa превращается в verylo ~ 1.pdf, и ваш шаблон поиска будет соответствовать ему. Требуется последующая фильтрация.
2. Как вы можете видеть в результате на скриншоте, ЭТО НЕ ТАК. На скриншоте видно, что файла .pdfa НЕТ в выходных данных.
3. Как объяснил Ганс, это произойдет, когда для файла есть альтернативные имена, которые имеют только трехбуквенное расширение, как в именах, совместимых с MS-DOS 8.3. В вашем примере файл, очевидно, не имеет имени 8.3, поэтому он не соответствует.
4. Чувак, не ори на меня. Вместо этого введите dir /x и кричите на то, что вы видите.
5. Добавьте это в вопрос, а не в комментарий. Но в любом случае, очевидно, что у файлов нет имен 8.3 — иначе они были бы показаны 🙂
Ответ №1:
Это ожидаемое поведение метода GetFiles, и то же самое происходит и в Windows, если вы выполняете поиск в каталоге с .pdf, он выберет файлы с расширениями .pdfa или *.pdfaaa, вам нужно будет Where()
указать себя, например:
Directory.GetFiles(directory, "*.pdf").Where(item => item.EndsWith(".pdf"));
Как вы можете видеть, когда мы выполняем поиск в Windows, он дает тот же результат, что и ваш код:
По причине того, почему GetFiles ведет себя таким образом, пожалуйста, посмотрите здесь, и вы также можете захотеть посмотреть на этот пост
Комментарии:
1. Как вы можете видеть на скриншоте, ЭТО НЕ ТАК!! У меня НЕТ файла .pdfa в выходных данных
2. Весь смысл вопроса в том, что он не всегда это делает.
pdfa
. Однако, если у вас есть имя 8.3, связанное с этим файлом, вы получите.pdfa
файл, потому что его имя 8.3 имеет расширение толькоpdfa
.3. Что вы имеете в виду, говоря «если у вас есть имя 8.3, связанное с этим файлом», я думаю, что у каждого файла есть имя 8.3, связанное, я ошибаюсь?
4. @PatriceVB Если у вас NTFS, его можно отключить ( support.microsoft.com/en-us/help/121007 /… ). В других файловых системах правила могут быть совершенно другими (CDS, FAT, сетевые ресурсы, ext …).
Ответ №2:
Как объяснили @luaan и @hans-passant (большое спасибо !) Я не нашел файл с расширением .pdfa, потому что формат 8.3 отключен на моем жестком диске.
На жестком диске с включенным форматом 8.3 метод ведет себя так, как указано в документе.
GetFiles ведет себя по-другому, если параметр включен или нет.