Saltar al contenido

Clase C# para analizar la respuesta FTP de WebRequestMethods.Ftp.ListDirectoryDetails

Este grupo redactor ha estado por horas investigando para dar resolución a tu duda, te brindamos la soluciones por eso deseamos resultarte de mucha apoyo.

Solución:

Para la primera lista (DOS/Windows), este código servirá:

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftp.example.com/");
request.Credentials = new NetworkCredential("user", "password");
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;
StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream());

string pattern = @"^(d+-d+-d+s+d+:d+(?:AM|PM))s+(|d+)s+(.+)$";
Regex regex = new Regex(pattern);
IFormatProvider culture = CultureInfo.GetCultureInfo("en-us");
while (!reader.EndOfStream)

    string line = reader.ReadLine();
    Match match = regex.Match(line);
    string s = match.Groups[1].Value;
    DateTime modified =
        DateTime.ParseExact(s, "MM-dd-yy  hh:mmtt", culture, DateTimeStyles.None);
    s = match.Groups[2].Value;
    long size = (s != "") ? long.Parse(s) : 0;
    string name = match.Groups[3].Value;

    Console.WriteLine(
        "0,-16 size = 1,9  modified = 2",
        name, size, modified.ToString("yyyy-MM-dd HH:mm"));

Conseguirás:

Version2         size =         0  modified = 2011-08-10 12:02
image34.gif      size = 144700153  modified = 2009-06-25 14:41
updates.txt      size = 144700153  modified = 2009-06-25 14:51
digger.tif       size = 144700214  modified = 2010-11-04 14:45

Para la otra lista (* nix), vea mi respuesta a la línea Parsing FtpWebRequest ListDirectoryDetails.


Pero, en realidad tratando de analizar la lista devuelta por el ListDirectoryDetails no es el camino correcto a seguir.

Desea utilizar un cliente FTP que admita la moderna MLSD comando que devuelve una lista de directorios en un formato legible por máquina especificado en el RFC 3659. Analizar el formato legible por humanos devuelto por el antiguo LIST comando (utilizado internamente por el FtpWebRequest por su ListDirectoryDetails método) debe usarse como la opción de último recurso, cuando se habla con servidores FTP obsoletos, que no admiten el MLSD comando (como el servidor FTP de Microsoft IIS).


Por ejemplo, con el ensamblado WinSCP .NET, puede usar su Session.ListDirectory o Session.EnumerateRemoteFiles métodos.

Usan internamente el MLSD comando, pero puede recurrir a la LIST ordena y admite docenas de diferentes formatos de listados legibles por humanos.

El listado devuelto se presenta como una colección de RemoteFileInfo instancias con propiedades como:

  • Name
  • LastWriteTime (con la zona horaria correcta)
  • Length
  • FilePermissions (analizado en derechos individuales)
  • Group
  • Owner
  • IsDirectory
  • IsParentDirectory
  • IsThisDirectory

(Soy el autor de WinSCP)


La mayoría de las demás bibliotecas de terceros harán lo mismo. Utilizando el FtpWebRequest La clase no es confiable para este propósito. Desafortunadamente, no hay otro cliente FTP incorporado en el marco .NET.

Estoy enfrentando este mismo problema y he creado una solución simple (aunque no muy robusta) usando Regex para analizar la información relevante de cada línea usando grupos de captura:

public static Regex FtpListDirectoryDetailsRegex = new Regex(@".*(?(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))s*(?[0-9]*)s*(?([0-9]|:)*)s*(?.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

A continuación, puede extraer los valores de los grupos de captura de la siguiente manera:

        string ftpResponse = "-r--r--r-- 1 ftp ftp              0 Nov 19 11:08 aaa.txt";
        Match match = FtpListDirectoryDetailsRegex.Match(ftpResponse);
        string month = match.Groups["month"].Value;
        string day = match.Groups["day"].Value;
        string yearTime = match.Groups["yearTime"].Value;
        string fileName = match.Groups["fileName"].Value;

Algunas cosas que no se nota son:

  • esto solo funcionará para respuestas de directorio con el formato descrito que se encuentra en el ftpResponse variable arriba. En mi caso, tengo la suerte de acceder solo al mismo servidor FTP cada vez, por lo que es poco probable que cambie el formato de respuesta.
  • la yearTime La variable puede representar YA SEA el año o la hora de la marca de tiempo del archivo. Deberá analizar esto manualmente buscando una instancia del carácter de dos puntos: que indicará que este grupo de captura contiene una hora en lugar del año.

Una solución que encontré es EdtFTPnet

EdtFTPnet parece ser una solución repleta de funciones que maneja muchas opciones diferentes de FTP, por lo que es ideal.

Es la solución gratuita de código abierto que he empleado para http://www.ftp2rss.com (una pequeña herramienta que necesitaba pero pensé que también podría ser útil para otros).

Si guardas alguna indecisión o capacidad de mejorar nuestro crónica puedes dejar un paráfrasis y con deseo lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *