2010-11-20 17 views
3

Ich habe bereits Dateien und Ordner Änderungen mit dem FileSystemWatcher gesehen.C# Datei/Ordner Monitor

Mein Problem ist, dass ich nicht zwischen Dateien und Ordner unterscheiden kann. Es ist möglich, dass eine Datei und ein Ordner die gleichen Pfadnamen haben.

Für das Lösch-Ereignis kann ich sogar ein schmutziges Workarround mit dem Testen von File.Exists (Pfad) oder Directory.Exists (Pfad) nicht verwenden, da die Datei/der Ordner bereits beim Aufruf der Methode gelöscht wurde.

Vielleicht hat dieses Objekt die Informationen, die ich brauche, aber ich habe es nicht gefunden:

FileSystemEventArgs e 

Ich mag wissen, nur dann, wenn die geänderte Position eine Datei oder ein Ordner ist.

Antwort

1

Ich habe eine Lösung gefunden, die sauber ist und funktioniert immer:

Die Standardeinstellung eines Watcher ist für Dateien und Ordner. Das ergibt in meinen Augen keinen Sinn, da ich nicht herausfinden kann, welchen Typ das veränderte Objekt hatte.

Es ist möglich, zwei Dateiwächter zu erstellen. Eine für Dateien und eine für Ordner. Dann müssen Sie nur die Standardeinstellungen wie folgt ändern:

+0

Das einzige Problem ist, dass FSW ThreadPool verwendet. Wenn Sie also mehrere Beobachter verwenden, spiegelt die Reihenfolge der Ereignisse möglicherweise nicht wider Wirklichkeit. Die einzige Lösung, die ich bisher gefunden habe, ist die Verwendung von Change Journals, wie von ho1 erwähnt, oder das Schreiben eines eigenen FileSystemWatcher mit [this] (http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychanges.html)) und [dies] (http://qualapps.blogspot.cz/2010/05/understanding-readdirectorychangesw_19.html).Wirf es einfach da raus für jeden, der in Zukunft über diesen Thread kommen wird. – Paya

1

Sie können testen, ob es das Verzeichnis hatattribute:

var attributes = File.GetAttributes(@"c:\somepath"); 
if ((attributes & FileAttributes.Directory) == FileAttributes.Directory) 
{ 
    // it's a directory 
} 
else 
{ 
    // it's a file 
} 

Natürlich, wenn es bereits gelöscht hat, wird dies nicht funktionieren und Sie werden zu sagen, der Lage sein, den Typ nicht.

+0

Sind Sie sicher, dass das funktioniert, wenn das OP hervorhebt, wo die Datei/das Verzeichnis gelöscht wird? –

+0

Nein, dies funktioniert nicht, wenn es bereits gelöscht wurde. –

+0

Dies schlägt fehl, wenn das Verzeichnis/die Datei bereits gelöscht wurde. – jason

0

Es ist nicht möglich, den Typ des gelöschten Elements abzurufen, es sei denn, Sie hatten zuvor eine Liste von Pfad-> Typzuordnungen, in der Sie den letzten Typ des gelöschten Elements nachschlagen können.

+0

??? ... wenn ich also eine Datei = C: \ Name und einen Ordner = C: \ Name habe, kann ich nicht herausfinden, was geändert wurde? – fpdragon

+1

Sie können keine Datei und ein Verzeichnis mit demselben Namen im selben Ordner haben. – ThiefMaster

+0

sowieso, wenn es bereits gelöscht ist, können Sie nicht herausfinden, ob es eine Datei oder ein Verzeichnis war – fpdragon

2

Angenommen, es ist auf einem NTFS-Volume Ich denke, Sie könnten tun, was Sie brauchen, indem Sie auf die Change Journals. Insbesondere die FSCTL_READ_USN_JOURNAL Steuercode und Blick auf die FileAttributes der zu sehen, ob es eine FILE_ATTRIBUTE_DIRECTORY ist.

Sie eine Probe finden Sie hier (in C++, aber könnte möglicherweise zu C# oder sonst vielleicht schreiben Sie einfach eine kleine C++ DLL rufen von Ihrem App übersetzen): Walking a Buffer of Change Journal Records

Verwandte Themen