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
Antwort
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...
}
}
}
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.
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 FTPLIST
Befehl) Details aller Dateien in einem Verzeichnis abrufen und dann geht man mit FTP-Server bestimmten Format die DetailsDOS/Windows-Format: C# class to parse WebRequestMethods.Ftp.ListDirectoryDetails FTP response
* nix-Format: Parsing FtpWebRequest ListDirectoryDetails lineGetDateTimestamp
Methode (der FTP-BefehlMDTM
) zum individuellen Abrufen von Zeitstempeln für jede Datei. Ein Vorteil ist, dass die Antwort von RFC 3659 bisYYYYMMDDHHMMSS[.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 inLastModified
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)
- 1. Ansible zum Herunterladen der Dateien von FTP
- 2. Herunterladen von Dateien von FTP mit R
- 3. Herunterladen von Dateien von URL
- 4. Herunterladen aller Dateien mit FTP und C#
- 5. Überprüfen, ob die Datei innerhalb der letzten Stunden erstellt wurde
- 6. Datei entpacken und von ftp herunterladen
- 7. Es werden keine Tabellen innerhalb von HIVE erstellt, aber Daten werden innerhalb von hdfs erstellt.
- 8. Herunterladen von .pdf-Datei von FTP mit einem Python-Skript
- 9. Herunterladen von Dateien
- 10. Get Liste der Dateien von FTP-Server
- 11. Grab verlassene Carters von der letzten Stunde in Oracle Responsys
- 12. Herunterladen von Dateien nacheinander
- 13. Herunterladen von Dateien über Python
- 14. Datei von der URL herunterladen und in ftp hochladen
- 15. Herunterladen von Dateien mit FtpWebRequest
- 16. Direkt bearbeiten Sie Dateien von einem FTP-Server mit Atom
- 17. Caching HTTP-Antworten, wenn sie dynamisch von PHP erstellt werden
- 18. Löschen von Dateien von FTP in C#
- 19. Herunterladen von Dateien unter Android
- 20. scrapy verhindern das Herunterladen von Dateien, wenn bereits heruntergeladen
- 21. Herunterladen von Dateien auf Asp.net
- 22. Ist es möglich, Dateien von FTP zu FTP mit PHP
- 23. iOS Swift Herunterladen von Dateien
- 24. Herunterladen mehrerer Dateien innerhalb foreach Schleife Ausgabe
- 25. Herunterladen von Dateien aus Zahnrad s2
- 26. Laden Sie mehrere FTP-Dateien
- 27. Welcher SSIS-Task kann zum Herunterladen von Dateien von einer HTTPS-URL verwendet werden?
- 28. Django Filter von Stunde
- 29. Maven: Herunterladen von Dateien von URL
- 30. Herunterladen von MHT-Dateien von Chrome
Siehe folgend SO Post, wo die OP der Zeitstempel zu erhalten: http://stackoverflow.com/questions/1040371/system-net-ftpwebrequest- getdatetimestamp-example –
@George Danke! Sieht so aus, als ob ich das brauchte. –