Warten für das system zu löschen die Datei
Hatte ich ein problem mit erfrischenden Dateiliste nach dem löschen einer Datei. Wenn ich gab Befehl zum löschen der Datei, die exception geworfen wurde, weil die refresh-Methode versucht auf eine Datei zuzugreifen, wurde die gelöscht werden soll.
Nach einiger überlegung und debugging kam ich zu dem Schluss, dass problem war in der Tat, das system braucht einige Zeit, um eine Datei zu löschen. Und ich löse es wie folgt:
//Deleting file
System.Threading.Thread.Sleep(2000);
//Refreshing list
und es funktionierte gut.
Meine Frage ist
Gibt es eine elegantere Möglichkeit zu warten, für system tun, löschen Sie die Datei und fahren Sie dann mit code...?
- Können wir sehen, der rest des code aus? Auch, welche Art von Dateisystem (lokales NTFS oder irgendeine form von NFS)? Die meisten filesystem delete-Operationen, die auf NTFS sowieso, sind atomar.
- Es ist auf NTFS. Welchen Teil des Codes, die Sie interessieren. Delete-Methode rekursiv löscht alle Dateien im Verzeichnis und das Verzeichnis selbst. Ich hätte nicht gedacht, dass das relevant ist, so sagte ich, dass ich brauchen, um eine Datei zu löschen ... Es ist die gleiche Sache, nicht wahr?
- Überhaupt nicht. Ich lasse eine Antwort
- Bitte Lesen Sie meine post, ich gerade aktualisiert die MSDN-link von FileSystemWatcher zu zeigen .NET 4.0 anstelle von 1.1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die eleganteste Art, wie ich denken kann, ist mit einem FileSystemWatcher und abonnieren Sie Ihre
Deleted
Veranstaltung.Diese funktioniert bei mir:
Finde ich, dass die meisten der Zeit, wird die while-Schleife wird nicht mehr betreten werden.
Leicht-code FileSystemWatcher, abonnieren Sie Ihre
Deleted
Ereignis und warten.Hier ist etwas code, mit dem FileWatcher. Was wir wollen in der Lage sein zu tun ist,
den unten implementiert
und einige utils, nutzen Sie die oben zu beobachten.
Ich immer diese verwendet:
Sehen hier und hier
Löschen ein Verzeichnis mit - Verzeichnis.Löschen, speziell die überlast, die es braucht, 'recursive' boolean, auf NTFS, sollte eine Atomare operation aus Ihrer Sicht des Programms. Keine Notwendigkeit, recurse manuell selbst.
Verzeichnis.Löschen, wird eine Ausnahme ausgelöst, die auf den ersten Fehler, auf die es trifft. Wenn Sie fortfahren möchten, löschen Sie so viele Dateien und Unterverzeichnisse, wie Sie können, dann sollten Sie nicht verwenden-Verzeichnis.Löschen Sie und schreiben Sie Ihre eigene rekursive löschen mit try/catch-Blöcke im inneren des loops. Ein Beispiel, möchten Sie vielleicht zu tun ist, wenn Sie versuchen, die Bereinigung von temp-Dateien und eine der Dateien, die gesperrt wurde.