2012-04-12 8 views
2

Ich muss Dateien aus bestimmten Ordner auf FTP herunterladen, aber nur diejenigen mit Erstellungszeit innerhalb der letzten Stunde. Also im Grunde muss ich alle Dateien aus diesem Ordner auflisten und dann nur diejenigen herunterladen, deren Zeitstempel sich nicht mehr als eine Stunde von der Ausführungszeit unterscheidet. Irgendwelche Ideen, wie Zeitstempel für Datei auf FTP zu analysieren? Ich kann keine FTP-Client-Bibliotheken von Drittanbietern verwenden.Herunterladen von Dateien von FTP, wenn sie innerhalb der letzten Stunde erstellt werden

+1

Siehe folgend SO Post, wo die OP der Zeitstempel zu erhalten: http://stackoverflow.com/questions/1040371/system-net-ftpwebrequest- getdatetimestamp-example –

+0

@George Danke! Sieht so aus, als ob ich das brauchte. –

Antwort

1

Das ist, was ich für jetzt gefunden habe. Sicher gibt einig elegantere Weg, dies zu handhaben, aber ...

foreach (var fileName in filesNamesFromFtpFolder) 
     { 
      FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(@"ftp://" + host + @"/" + folder + @"/" + fileName); 

      request.Method = WebRequestMethods.Ftp.GetDateTimestamp; 
      request.Proxy = null; 

      using (FtpWebResponse resp = (FtpWebResponse)request.GetResponse()) 
      { 
       if (DateTime.Now.Subtract(TimeSpan.FromMinutes(60)) < resp.LastModified) 
       { 
        //download this file... 
       } 
      } 
     } 
1

Die Hauptaufgabe kann möglicherweise nicht der Zeitstempel der Lesedatei sein, sondern die Feststellung, dass sie innerhalb einer letzten Stunde geändert wurde. Wenn Ihr Server sich in derselben TimeZone befindet, entspricht er Ihrer Zeit. Wenn nicht, wird es eine Zeitverschiebung geben. Wenn Sie immer denselben Server verwenden, kann dies auf ziemlich zuverlässige Weise behoben werden. Aber wenn Sie mehrere Server auf der ganzen Welt verwenden, wird dies ein wenig komplizierter. Also sei dir bewusst.

0

Leider gibt es keine wirklich zuverlässige und effiziente Art und Weise Änderung Zeitstempel aller Dateien in einem Verzeichnis mit Features von .NET Framework angeboten abzurufen, wie es unterstützt das FTP MLSD nicht. Der Befehl MLSD bietet eine Auflistung des Remote-Verzeichnisses in einem standardisierten maschinenlesbaren Format. Der Befehl und das Format sind durch RFC 3659 standardisiert.

Alternativen Sie verwenden können, die von .NET Framework unterstützt:

  • ListDirectoryDetails Methode (der FTP LIST Befehl) Details aller Dateien in einem Verzeichnis abrufen und dann geht man mit FTP-Server bestimmten Format die Details

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

  • GetDateTimestamp Methode (der FTP-Befehl MDTM) zum individuellen Abrufen von Zeitstempeln für jede Datei. Ein Vorteil ist, dass die Antwort von RFC 3659 bis YYYYMMDDHHMMSS[.sss] standardisiert ist. Ein Nachteil ist, dass Sie für jede Datei eine separate Anfrage senden müssen, was ziemlich ineffizient sein kann. Die Dateibearbeitungszeit für Sie in LastModified property analysiert wird:

    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); 
    if (response.LastModified > DateTime.Now.Subtract(TimeSpan.FromHours(1))) 
    { 
        // download 
    } 
    

Way einfacher zu bedienen ist (ich weiß, kann man nicht) eine 3rd-Party-FTP-Client-Implementierung, die den modernen MLSD Befehl oder die Träger kann Dateien mit Zeitbeschränkung direkt herunterladen.

Zum Beispiel unterstützt WinSCP .NET assembly sowohl MLSD als auch time constraints.

Es gibt sogar ein Beispiel für Ihre spezifische Aufgabe: How do I transfer new/modified files only?
Das Beispiel für Powershell ist, aber übersetzt C# leicht:

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

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

    // Download files modified with the last hour 
    TransferOptions transferOptions = new TransferOptions(); 
    transferOptions.FileMask = "*>=1H"; 
    session.GetFiles("/remote/path/*", @"C:\local\path\", false, transferOptions).Check(); 
} 

Siehe auch Syntax für time constraints.

(ich bin der Autor von WinSCP)

Verwandte Themen