2012-02-14 27 views
5

Primero pregunté que: ftp directory listing timeout. Huge number of subdirs. Tengo la respuesta.Lista parcial del directorio FTP con comodines

Aún porque puedo tener cientos de miles de objetos FTP en el directorio, podría tomar mucho tiempo escanearlos. Sin embargo, pensé que sería posible recuperar todos los objetos que comienzan con 'A' y luego 'B' y así sucesivamente ... A medida que recupera los directorios, podría comenzar a procesarlos en el otro subproceso sin esperar hasta obtener toda la lista .

¿Es posible hacer una lista de directorios FTP con comodines usando el estándar FtpWebRequest?

Respuesta

6

La actualización más reciente al FTP specification (RFC 3659) lo prohíbe explícitamente. De section 2.2.2 of that specification, titled "Wildcarding" (énfasis mío):

Para los comandos definidos en esta especificación, todos los nombres de ruta son a ser tratado literalmente. Es decir, para una ruta dada como un parámetro a un comando, el archivo cuyo nombre es idéntico al nombre de ruta dado es implícito. Ningún carácter de la ruta de acceso puede tratarse como especial o "mágico", por lo que no se permite ninguna coincidencia de patrón (que no sea para la igualdad exacta) entre la ruta especificada y los archivos presentes en el NVFS del servidor -FTP.

Los clientes que deseen algún tipo de funcionalidad de búsqueda de patrones deben obtener una lista del directorio correspondiente o directorios, y aplicar sus propios procedimientos de selección de nombre de archivo .

Dicho esto, si su servidor lo admite, aún puede utilizar el FtpWebRequest class, pero usted tendría que procesar la respuesta a sí mismo para manejar la lista de elementos, como las clases .NET no van a entender su extensiones específicas del servidor.

0

La especificación de FTP dice que el argumento para los comandos de listado de archivos (LIST, NLIST, MLSD, etc.) es una ruta de acceso. Entonces no debería haber ningún comodín, en absoluto.

RFC 959 (LIST + NLIST):

2,2. TERMINOLOGÍA

... se define

pathname

nombre de ruta que es la cadena de caracteres que debe ser entrada a un sistema de archivos por un usuario con el fin de identificar un archivo. El nombre de ruta normalmente contiene los nombres de dispositivo y/o directorio y la especificación de nombre de archivo . FTP aún no especifica una convención estándar de nombre de ruta . Cada usuario debe seguir el nombre del archivo convenciones de los sistemas de archivos involucrados en la transferencia.

...

5.3.1.Comandos FTP

...

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

RFC 3659 (MLSD):

2.2.2. Wildcarding

Para que los comandos definidos en esta especificación, todos los nombres de las rutas sean sean tratados literalmente. Es decir, para una ruta dada como un parámetro a un comando, se implica el archivo cuyo nombre es idéntico al nombre de ruta dado . No se pueden tratar caracteres de la ruta como especial o "mágico", por lo que no se permite ninguna coincidencia de patrón (excepto para la igualdad exacta de ) entre la ruta asignada y los archivos presentes en el NVFS del servidor FTP.

...

7,1. Formato de MLSx Pide

...

La sintaxis del comando es MLSx:

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

En la práctica, aunque muchos servidores FTP sí apoyo wilcards en el argumento. Pero como la especificación no lo permite, obviamente no existe un estándar establecido para los comodines admitidos.

vsftpd apoya *, ? y {} con el LIST. vsftpd no es compatible con el MLSD moderno.

proftpd apoya *, ? y []. Pero solo para el LIST. No permite explícitamente los comodines con el MLSD moderno con un comentario:

RFC3659 explícitamente NO admite caracteres glob. Así que advierta sobre esto, pero deje que el comando continúe como está.

PureFTPd apoya *, ? y [] tanto para el LIST y la MLSD.

servidor de FileZilla apoya * única tanto para el LIST y la MLSD.


Pero, en general, no debe confiar en el servidor FTP para admitir ningún comodín.

El único enfoque confiable es recuperar una lista completa de directorios y filtrar los archivos localmente. Por ejemplo, puede usar una expresión regular (Regex class)

Cuestiones relacionadas