2010-12-15 6 views
15

J'utilise la classe System.Net.FtpWebRequest et mon code est le suivant:Date de création Récupération de fichiers (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(); 

C'est basé sur des exemples fournis sur MSDN, mais je ne pouvais pas trouver quelque chose de plus détaillé.

Je stocke tous les noms de fichiers dans le dossier names mais comment puis-je maintenant parcourir chacun d'eux et récupérer leurs dates? Je veux récupérer les dates afin que je puisse trouver les fichiers les plus récents. Merci.

+0

Je suis assez sûr que ftp ne prend en charge pour les dates modifiées, pas les dates de création. – Nyerguds

Répondre

14

WebRequestMethods.Ftp.ListDirectory retourne une "liste courte" de tous les fichiers dans un répertoire FTP. Ce type de liste ne fournira que des noms de fichiers - pas de détails supplémentaires sur le fichier (comme les autorisations ou la date de dernière modification).

Utilisez plutôt WebRequestMethods.Ftp.ListDirectoryDetails. Cette méthode renvoie une longue liste de fichiers sur le serveur FTP. Une fois que vous avez récupéré cette liste dans la variable names, vous pouvez diviser la variable names en un tableau basé sur un caractère de fin de ligne. Cela aboutira à ce que chaque élément de tableau soit un nom de fichier (ou répertoire) qui inclut les autorisations, le dernier propriétaire de date modifié, etc ...

À ce stade, vous pouvez parcourir ce tableau, examiner la dernière date de modification pour chaque fichier et décidez si vous souhaitez télécharger le fichier.

J'espère que cela aide !!

+2

Fonctionne en théorie mais la réponse du serveur FTP complique les choses de manière significative. – Radu

+1

Si vous pouvez partager la réponse que vous obtenez du serveur - peut-être que je peux fournir une aide supplémentaire. Ma réponse était intentionnellement un peu générique parce que la réponse réelle du serveur va varier d'un serveur à l'autre. – pmartin

+1

juste pour clarifier, c'est la date * modifiée * pas la date * créée *, qui est ce qui a été demandé, non? –

-1

D'abord, vous devrez séparer les noms en utilisant String.Split sur le délimiteur de nom de fichier. Passez ensuite en revue toutes les chaînes et parcourez les répertoires.

+0

La commande ListDirectory ne fournit aucun détail sur les fichiers, il n'y a rien à diviser. – brablc

25

Cela semble fonctionner très 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

c'est la bonne façon de le faire – d512

+2

juste pour clarifier, c'est la date * modifiée * pas la date * créée *, qui est ce qui a été demandé, non? –

14

Malheureusement, il n'y a aucun moyen vraiment fiable et efficace pour récupérer des horodateurs à l'aide des fonctionnalités offertes par le framework .NET, car il ne supporte pas la commande FTP MLSD. La commande MLSD fournit une liste de répertoire distant dans un format lisible par machine normalisé. La commande et le format sont normalisés par RFC 3659.

Alternatives vous pouvez utiliser, qui sont pris en charge par le framework .NET:

  • méthode ListDirectoryDetails (la commande FTP LIST) pour récupérer les détails de tous les fichiers dans un répertoire et vous traiter avec le serveur FTP format spécifique des détails (format * nix similaire à la commande ls * nix est le plus commun, un inconvénient est que le format peut changer au fil du temps, comme pour les nouveaux fichiers "8 mai 17:48" format est utilisé et pour les anciens fichiers "Oct 18 2009 "format est utilisé).

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

  • méthode GetDateTimestamp (la commande FTP MDTM) pour récupérer individuellement horodatages pour chaque fichier. Un avantage est que la réponse est normalisée par RFC 3659 à YYYYMMDDHHMMSS[.sss]. Un inconvénient est que vous devez envoyer une demande séparée pour chaque fichier, ce qui peut être assez inefficace.

    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); 
    

Vous pouvez également utiliser une 3ème partie implémentation client FTP qui prend en charge la commande MLSD moderne. Par exemple, WinSCP .NET assembly prend en charge cette propriété.

Il existe même un exemple pour votre tâche spécifique: Downloading the most recent file.
L'exemple est pour PowerShell et le SFTP, mais se traduit par C# et FTP facilement:

// 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(); 
} 

(je suis l'auteur de WinSCP)

+2

Cela devrait être la réponse. Je vous remercie. –

Questions connexes