2009-05-08 3 views
0

Ich schreibe einen Windows-Dienst, der eine Datei aus einem FTP-Ordner auf dem lokalen Computer nehmen und die Daten in dieser Datei analysieren und an eine externe Quelle senden muss. Die Datei wird zu einem bestimmten Zeitpunkt von einer anderen Partei in den FTP-Ordner hochgeladen, und ich kann nicht vorhersagen, wann die Datei hochgeladen wird. Ich brauche den Dienst, um den FTP-Ordner scannen und erkennen zu können, wenn die Datei kürzlich auf den Server hochgeladen wurde, und den Parsing-Prozess zu starten.Wie kann ich feststellen, wenn eine Datei kürzlich in einem FTP-Ordner überschrieben wurde?

Ich brauche etwas wissen, wenn es in .NET eine Möglichkeit gibt zu erkennen, wenn eine Datei in ein Verzeichnis abgelegt wurde.

Es gibt eine ähnliche Frage in SO über diese here, aber es war nicht in Bezug auf das Schreiben eines Windows-Dienstes. Außerdem schien die Lösung darin zu bestehen, das Verzeichnis selbst zu überwachen, aber ich habe diese Idee mit der DirectoryInfo-Klasse getestet und es funktioniert nicht, wenn ich die LastWriteTime-Eigenschaft anschaue. Die Uhrzeit des Verzeichnisses ändert sich nicht, wenn ich eine Datei im Verzeichnis kopiere und ersetze.

Hinweis: Ich kann mich nicht auf die Zeitstempel für die Erstellung/Änderung in der Datei verlassen, da ich nicht weiß, wie die andere Partei diese Dateien generiert.

Antwort

3

Verwenden Sie einen FileSystemWatcher. Das wird ein "verändertes" (oder sogar ein "erschaffenes", glaube ich) Ereignis auslösen, mit dem Sie umgehen können. Sie müssen vorsichtig sein, um sicherzustellen, dass die Datei vollständig geschrieben ist, bevor Sie anfangen, damit zu arbeiten, aber das sollte Sie in die richtige Richtung weisen.

EDIT: Um Josephs Frage, wie, hier ist eine statische Methode, die ich für einen solchen Gelegenheiten in meiner Dienstprogramme Klasse halten: (! FileComplete (foo))

 
public static bool FileComplete(string filePath) 
     { 
      try 
      { 
       File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
       return true; 
      } 
      catch { return false; } 
     } 

Dann habe ich nur eine While {} vor meiner tatsächliche Dateiverarbeitung.

+0

Danke AllenG, aber wie würde ich herausfinden, ob die Datei vollständig geschrieben ist? Würde ich das aus der FileInfo-Klasse erfassen? – Joseph

+0

Die Art, wie ich es mache, ist der Versuch, die Datei mit FileSharing.None zu öffnen, um zu sehen, ob die FTP-Transaktion noch versucht, in die Datei zu schreiben. Sobald Sie es auf diese Weise öffnen können, sollten Sie gut gehen. Es mag einen besseren Weg geben, aber wenn, dann weiß ich es nicht. – AllenG

Verwandte Themen