2010-12-15 49 views
15

estoy usando la clase System.Net.FtpWebRequest y mi código es el siguiente:Recuperando la fecha de creación de archivos (FTP)

FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://example.com/folder"); 
request.Method = WebRequestMethods.Ftp.ListDirectory; 

request.Credentials = new NetworkCredential("username", "password"); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

Stream responseStream = response.GetResponseStream(); 
StreamReader reader = new StreamReader(responseStream); 

string names = reader.ReadToEnd(); 

reader.Close(); 
response.Close(); 

Esto se basa apagado de los ejemplos proporcionados en MSDN pero no pude encontrar nada más detallado.

Estoy almacenando todos los nombres de archivo en la carpeta en names, pero ¿cómo puedo ahora recorrer cada uno de ellos y recuperar sus fechas? Quiero recuperar las fechas para poder encontrar los archivos más nuevos. Gracias.

+0

Estoy bastante seguro ftp tan sólo soporta para fechas modificadas, no fechas de creación. – Nyerguds

Respuesta

14

WebRequestMethods.Ftp.ListDirectory devuelve una "lista corta" de todos los archivos en un directorio FTP. Este tipo de listado solo proporcionará nombres de archivo, no detalles adicionales sobre el archivo (como permisos o la última fecha de modificación).

Use WebRequestMethods.Ftp.ListDirectoryDetails en su lugar. Este método devolverá una larga lista de archivos en el servidor FTP. Una vez que haya recuperado esta lista en la variable names, puede dividir la variable names en una matriz basada en un carácter de fin de línea. Esto dará como resultado que cada elemento de matriz sea un listado de nombre de archivo (o directorio) que incluya los permisos, el propietario de la última fecha de modificación, etc. ...

En este punto, puede iterar sobre esta matriz, examinar la última fecha de modificación para cada archivo, y decidir si descargar el archivo.

Espero que esto ayude !!

+2

Funciona en teoría, pero la respuesta del servidor FTP complica las cosas significativamente. – Radu

+1

Si puede compartir la respuesta que recibe del servidor, tal vez pueda brindarle más ayuda. Mi respuesta fue intencionalmente un poco genérica porque la respuesta real del servidor variará de un servidor a otro. – pmartin

+1

solo para aclarar, esta es la fecha * modifed *, no la fecha * created *, que es lo que se solicitó, ¿no? –

-1

Primero tendrá que separar los nombres usando String.Split en el delimitador de nombre de archivo. Luego, itere a través de todas las cadenas y navegue por los directorios

+0

Command ListDirectory no proporciona ningún detalle sobre los archivos, no hay nada que dividir. – brablc

25

Esto parece funcionar muy bien http://msdn.microsoft.com/en-us/library/system.net.ftpwebresponse.lastmodified(v=VS.90).aspx

FtpWebRequest request = (FtpWebRequest)WebRequest.Create (serverUri); 
request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
Console.WriteLine ("{0} {1}",serverUri,response.LastModified); 
+2

esta es la manera correcta de hacer esto – d512

+2

solo para aclarar, esta es la fecha * modifed * no la fecha * created *, que es lo que se pidió, ¿no? –

14

Desafortunadamente, no hay manera muy fiable y eficiente para recuperar las marcas de tiempo utilizando características ofrecidas por el marco .NET, ya que no es compatible con el comando FTP MLSD. El comando MLSD proporciona una lista de directorios remotos en un formato estandarizado legible por máquina. El comando y el formato está estandarizado por RFC 3659.

alternativas que se pueden utilizar, que son compatibles con .NET framework:

  • ListDirectoryDetails método (el comando FTP LIST) para recuperar datos de todos los archivos en un directorio y luego se tratan con formato específico servidor FTP de los detalles (el formato * nix similar al ls * nix es el más común, un inconveniente es que el formato puede cambiar con el tiempo, en cuanto a archivos más nuevos se usa el formato "8 de mayo 17:48" y para archivos anteriores "Oct 18 2009 "formato se utiliza).

    formato DOS/Windows: C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
    formato * nix: Parsing FtpWebRequest ListDirectoryDetails line

  • GetDateTimestamp método (el comando FTP MDTM) para recuperar de forma individual marcas de tiempo para cada archivo. Una ventaja es que la respuesta está estandarizada por RFC 3659 a YYYYMMDDHHMMSS[.sss]. Una desventaja es que debe enviar una solicitud por separado para cada archivo, lo que puede ser bastante ineficiente.

    const string uri = "ftp://example.com/remote/path/file.txt"; 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri); 
    request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
    FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
    Console.WriteLine("{0} {1}", uri, response.LastModified); 
    

Como alternativa se puede utilizar una aplicación cliente FTP tercera parte que soporta el comando MLSD moderna. Por ejemplo, WinSCP .NET assembly es compatible con eso.

Incluso hay un ejemplo para su tarea específica: Downloading the most recent file.
El ejemplo es para PowerShell y el SFTP, pero se traduce en C# y el FTP fácilmente:

// Setup session options 
SessionOptions sessionOptions = new SessionOptions 
{ 
    Protocol = Protocol.Ftp, 
    HostName = "example.com", 
    UserName = "username", 
    Password = "password", 
}; 

using (Session session = new Session()) 
{ 
    // Connect 
    session.Open(sessionOptions); 

    // Get list of files in the directory 
    string remotePath = "/remote/path/"; 
    RemoteDirectoryInfo directoryInfo = session.ListDirectory(remotePath); 

    // Select the most recent file 
    RemoteFileInfo latest = 
     directoryInfo.Files 
      .OrderByDescending(file => file.LastWriteTime) 
      .First(); 

    // Download the selected file 
    string localPath = @"C:\local\path\"; 
    string sourcePath = RemotePath.EscapeFileMask(remotePath + latest.Name); 
    session.GetFiles(sourcePath, localPath).Check(); 
} 

(yo soy el autor de WinSCP)

+2

Esta debería ser la respuesta. Gracias. –

Cuestiones relacionadas