2009-07-13 7 views
1

Ich habe ein Problem mit Filewatcher. Meine Anforderung ist, dass FSW beim Kopieren eines großen Ordners der Größe 1 GB oder mehr nur eine Änderung protokollieren soll, die X erstellt hat, aber nicht die erstellten Ereignisse von Dateien unterhalb von X. Und ich wollte MD5-Prüfsummen berechnen all diese Dateien, die mit dem Ordner "X" kopiert werden. Da das Kopieren großer Dateien viel Zeit in Anspruch nimmt, kann ich nicht alle Dateien und Unterordnernamen unter X abrufen. Ich muss alle Dateipfade zu einer Wörterbuchdatenstruktur hinzufügen. Könnten Sie bitte darüber beraten.FileSystemWatcher

public static string[] GetFilesAndFolders(string path) 
    { 
     foreach (string dirs in Directory.GetDirectories(path)) 
     { 
      fileandFolderNames[counter] = dirs; 
      counter++; 
      foreach (string files in Directory.GetFiles(dirs)) 
      { 
       fileandFolderNames[counter] = files; 
       counter++; 
      } 
      GetFilesAndFolders(dirs); 
     } 
     return fileandFolderNames; 
    } 
+0

Und ein wenig aus dem Thema Kommentar, warum Sie 'und' aus Kleinbuchstaben innerhalb Funktionsname schreiben? Es wird besser in Großbuchstaben lesbar sein, z.B. - getFilesAndFolders. –

+3

eigentlich mit Standard-Namenskonventionen sollte es GetFilesAndFolders() – Ian

+0

als Sie rekursive Funktionsaufruf auch bearbeiten sollten;) Ich habe keinen Zugriff auf Fragen zu bearbeiten :) –

Antwort

3

Da einen großen Ordner kopieren nicht eine einzige Operation, sondern besteht stattdessen aus vielen einzelnen Kopiervorgänge, bestimmen die Filesystemwatcher kann nicht, wenn der Kopiervorgang des gesamten Ordner abgeschlossen ist. So erhalten Sie eine Benachrichtigung über jede Datei separat. Mein Vorschlag ist, jede Datei einzeln zu behandeln. Wenn es kopiert wird (das Ereignis von FileSystemWatcher wird ausgelöst), berechnen Sie das MD5, und legen Sie es in dem Wörterbuch ab.

0

Eine Sache, die Sie wissen sollten, ist, dass das Kopieren aller Dateien und Ordner rekursiv ein Stapelüberlauf ist, der darauf wartet, zu passieren. Informationen zum Erstellen einer Verzeichnishierarchie in einer nicht rekursiven IEnumerable-Klasse finden Sie unter this question und this blog post.

Verwandte Themen