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.