Частичный список каталогов FTP с подстановочными знаками - PullRequest
5 голосов
/ 14 февраля 2012

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

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

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

Ответы [ 2 ]

7 голосов
/ 29 мая 2012

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

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

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

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

0 голосов
/ 28 января 2015

В спецификации 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 класс )

...