c# - Lista parcial del directorio FTP con comodines
wildcard ftpwebrequest (2)
La actualización más reciente a la especificación de FTP (RFC 3659) lo prohíbe explícitamente. De la sección 2.2.2 de esa especificación, titulada "Wildcarding" (énfasis mío):
Para los comandos definidos en esta especificación, todos los nombres de ruta deben ser tratados literalmente. Es decir, para una ruta de acceso dada como un parámetro a un comando, el archivo cuyo nombre es idéntico al nombre de ruta dado está implícito. Ningún carácter de la ruta de acceso se puede tratar 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 de acceso proporcionada y los archivos presentes en el NVFS del servidor-FTP.
Los clientes que desean alguna forma de funcionalidad de coincidencia de patrones deben obtener una lista del directorio o directorios relevantes, e implementar sus propios procedimientos de selección de nombre de archivo.
Dicho esto, si su servidor lo admite, podría seguir utilizando la clase FtpWebRequest
, pero tendría que procesar la respuesta usted mismo para manejar la lista de elementos, ya que las clases .NET no comprenderán las extensiones específicas de su servidor.
Primero pregunté eso: tiempo de espera de listado de directorio ftp. Gran cantidad de subdirectores . Tengo la respuesta.
Sin embargo, debido a que 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 FtpWebRequest
estándar?
La especificación de FTP dice que el argumento para presentar los comandos de listado ( LIST
, NLIST
, MLSD
, etc.) es un nombre de ruta. Entonces no debería haber ningún comodín, en absoluto.
RFC 959 ( LIST
+ NLIST
):
2.2. TERMINOLOGÍA
...
pathname
Pathname se define como la cadena de caracteres que un usuario debe ingresar a un sistema de archivos para identificar un archivo. Pathname normalmente contiene nombres de dispositivo y / o directorio, y especificación de nombre de archivo. FTP aún no especifica una convención de ruta de acceso estándar. Cada usuario debe seguir las convenciones de nomenclatura de archivos 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 los comandos definidos en esta especificación, todos los nombres de ruta deben ser tratados literalmente. Es decir, para una ruta de acceso dada como un parámetro a un comando, el archivo cuyo nombre es idéntico al nombre de ruta dado está implícito. Los caracteres de la ruta no pueden tratarse como especiales o "mágicos", por lo que no se permite la coincidencia de patrones (excepto la igualdad exacta) entre la ruta de acceso proporcionada y los archivos presentes en la NVFS del servidor FTP.
...
7.1. Formato de solicitudes MLSx
...
La sintaxis para el comando MLSx es:
mlst = "MLst" [ SP pathname ] CRLF mlsd = "MLsD" [ SP pathname ] CRLF
En la práctica, sin embargo, muchos servidores FTP admiten wilcards en el argumento. Pero como la especificación no lo permite, obviamente no existe un estándar establecido para los comodines admitidos.
vsftpd es compatible con *
,? y {}
con la LIST
. vsftpd no es compatible con el MLSD
moderno.
proftpd admite *
,? y []
. Pero solo para la LIST
. No permite explícitamente los comodines con el MLSD
moderno con un comentario:
RFC3659 explícitamente NO admite caracteres glob. Así que advierte sobre esto, pero deja que el comando continúe como está.
pureftpd admite *
,? y []
tanto para LIST
como para MLSD
.
El servidor FileZilla solo admite *
tanto la LIST
como el 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 (la clase Regex
)