2009-08-21 19 views
1

Ich verwende den folgenden Code, um auf Änderungsereignisse einer Datei zu warten, die ich von einem Server herunterlade und öffne. Das Änderungsereignis wird jedoch nur ausgelöst, wenn die Datei zum ersten Mal gespeichert wird. Bei nachfolgenden Speichervorgängen löst der Dateiwatcher keine Änderungsereignisse aus.FileSystemWatcher - nur einmal das Änderungsereignis einmal ausgelöst?

Kann jemand sehen, was los ist?

private FileSystemWatcher StartWatchingFile() 
{ 
    fw = new FileSystemWatcher(); 
    fw.Path = this.directoryLocation; 
    fw.Filter = this.Filename; 

    fw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite; 

    // Add event handler 
    fw.Changed += new FileSystemEventHandler(fw_Changed); 

    // Open file   
System.Diagnostics.Process.Start(this.CreateAbsoluteFilePath(this.Filename)); 

    // Begin watching. 
    fw.EnableRaisingEvents = true; 

    return fw; 
} 

//************************ 

    void fw_Changed(object sender, FileSystemEventArgs e) 
    { 
     MessageBox.Show("File: " + e.FullPath + " " + e.ChangeType); 
    } 

EDIT: Die StartWatchingFile() gibt jetzt die Penguin Computing, die in einer Klasse gehalten wird, die nicht Müll gesammelt werden, nur um sicherzustellen, dass ich die ganze Klasse bin halten als die fw_changed dachte() Funktion möglicherweise nicht in der Lage sein, angerufen zu werden. Die gesamte Klasse wird jetzt nicht mehr mit Garbage Collection behandelt. Die Klasse in einem Arraylist gehalten wird, die ein öffentliches Mitglied einer Klasse ist

Grüße,

Jon

+0

Der Code, den Sie gepostet haben, fängt die umbenannten oder gelöschten Ereignisse nicht ab. Ich nehme an, die Datei wird nicht umbenannt oder gelöscht? –

+0

Das ist korrekt – Jon

Antwort

1

Es tut mir leid, dass ich Ihre Frage nicht speziell beantworten kann. Im Allgemeinen werde ich dazu beitragen, dass Sie, wenn Sie es genug verwenden, erfahren werden, dass FileSystemWatcher nicht zuverlässig ist. Microsoft Connect zeigt multiple problems damit. Ich stimme zu Jason Jackson's take on FileSystemWatcher.

+0

Welche Wurzel würden Sie vorschlagen? Das Szenario ist, dass ich eine Datei von einem Server herunterlade, die der Benutzer bearbeiten darf. Sobald die Benutzer die Bearbeitung abgeschlossen haben, muss die geänderte Datei ohne Eingabe des Benutzers erneut auf den Server hochgeladen werden. Der Gefangene ist der Benutzer kann die Datei schließen, aber nicht das Programm, in dem es bearbeitet wird? Danke für deinen Beitrag. – Jon

+0

Ich kann nicht gut mit der Sorge darüber sprechen, dass die andere Bearbeitungssoftware eine Sperre (oder was auch immer) in der Datei hat, die Sie hochladen müssen. Aber im Hinblick auf das "Beobachten" der Datei nach Änderungen würde ich das Dateisystem abfragen und vergleichen, was Sie zuvor gesehen haben (letzter geänderter Zeitstempel, Dateigröße, was auch immer), und "auf den Server hochladen", wenn Sie die Änderung sehen Du hast gesucht. Es ist hässlich, aber es ist zuverlässig. – lance

1

Ist es reproduzierbare, dass es immer Werke zum ersten Mal?

Wenn nicht, könnte die FileSystemWatcher vom Garbage Collector in der Zwischenzeit gesammelt worden sein, nachdem StartWatchingFile beendet wurde, weil es lokal deklariert ist.

Wenn ja, sperrt der Prozess, den Sie starten, die Datei wahrscheinlich, sodass die Datei nicht geändert wird?

+0

Ich halte jetzt die ganze Klasse in einer Variablen einer anderen Klasse, so dass es nicht Müll gesammelt wird, aber es wird nur noch einmal ausgelöst. Ich denke, Sie haben Recht, wenn die Datei von der Anwendung gesperrt wird, die sie öffnet, aber warum feuert der Dateiwächter nur beim ersten Speichern ab? – Jon

+0

Bitte aktualisieren Sie Ihre Frage, um Ihre Codeänderungen widerzuspiegeln. – dtb

+0

Ich habe es gerade aktualisiert – Jon