Частичное перечисление каталога FTP с подстановочными знаками

Сначала я спросил это: тайм-аут списка каталогов ftp. Огромное количество subdirs. Я получил ответ.

Тем не менее, поскольку у меня в каталоге могут быть сотни тысяч объектов FTP, его сканирование может занять очень много времени. Однако я подумал, что можно было бы получить все объекты, которые начинаются с "A", а затем "B" и т. Д. По мере извлечения каталогов он может начать обрабатывать их в другом потоке, не дожидаясь, пока он получит весь список.,

Можно ли сделать список каталогов FTP с подстановочными знаками, используя стандартные FtpWebRequest?

2 ответа

Решение

Последнее обновление спецификации FTP (RFC 3659) явно запрещает это. Из раздела 2.2.2 этой спецификации под названием "Подстановочные знаки" (выделено мной):

Для команд, определенных в этой спецификации, все имена путей должны рассматриваться буквально. То есть для пути, заданного в качестве параметра команды, подразумевается файл, имя которого совпадает с указанным. Никакие символы из пути не могут рассматриваться как специальные или "магические", поэтому не допускается сопоставление с образцом (кроме точного равенства) между указанным путем и файлами, присутствующими в NVFS сервера-FTP.

Клиенты, которым нужна какая-либо форма соответствия шаблонов, должны получить список соответствующих каталогов или каталогов и реализовать свои собственные процедуры выбора имен файлов.

Тем не менее, если ваш сервер поддерживает это, вы все равно можете использовать FtpWebRequest класса, но вам придется обработать ответ самостоятельно, чтобы обработать список элементов, поскольку классы.NET не будут понимать ваши специфичные для сервера расширения.

Спецификация FTP говорит, что аргумент к командам перечисления файлов (LIST, NLIST, MLSD и т. д.) - это путь. Так что не должно быть подстановочных знаков, вообще.

RFC 959 (LIST + NLIST):

2.2. ТЕРМИНОЛОГИЯ

...

pathname

Путь определяется как символьная строка, которая должна быть введена пользователем в файловую систему для идентификации файла. Путь обычно содержит имена устройств и / или каталогов, а также спецификацию имени файла. FTP еще не определяет стандартное соглашение о путевых именах. Каждый пользователь должен следовать соглашениям об именах файлов файловых систем, участвующих в передаче.

...

5.3.1. FTP КОМАНДЫ

...

LIST [<SP> <pathname>] <CRLF>
NLST [<SP> <pathname>] <CRLF>

RFC 3659 (MLSD):

2.2.2. подстановочные знаки

Для команд, определенных в этой спецификации, все имена путей должны рассматриваться буквально. То есть для пути, заданного в качестве параметра команды, подразумевается файл, имя которого совпадает с указанным. Никакие символы из пути не могут рассматриваться как специальные или "магические", поэтому не допускается сопоставление с образцом (кроме точного равенства) между указанным путем и файлами, присутствующими в NVFS сервера-FTP.

...

7.1. Формат запросов MLSx

...

Синтаксис команды MLSx:

mlst             = "MLst" [ SP pathname ] CRLF
mlsd             = "MLsD" [ SP pathname ] CRLF

На практике многие FTP-серверы поддерживают в этом аргументе wilcards. Но поскольку спецификация не допускает этого, очевидно, что не существует установленного стандарта для поддерживаемых подстановочных знаков.

vsftpd поддерживает *, ? а также {} с LIST, vsftpd не поддерживает современные MLSD,

proftpd поддерживает *, ? а также [], Но для LIST только. Это явно не позволяет подстановочные знаки с современными MLSD с комментарием:

RFC3659 явно НЕ поддерживает символы глобуса. Так что предупредите об этом, но пусть команда продолжит работу как есть.

поддерживает pureftpd *, ? а также [] для обоих LIST и MLSD,

Сервер FileZilla поддерживает * только оба LIST и MLSD,


Но в целом вам не следует полагаться на FTP-сервер для поддержки каких-либо подстановочных знаков вообще.

Единственный надежный подход - получить полный список каталогов и отфильтровать файлы локально. Например, вы можете использовать регулярное выражение (Regex класс)

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