System.IO.File.Move - Wie warte ich auf den Abschluss des Zuges?

8

Ich schreibe eine WPF-Anwendung in c # und ich muss einige Dateien verschieben - das Problem ist, dass ich wirklich wissen muss, ob die Dateien es schaffen. Um dies zu tun, schrieb ich eine Überprüfung, die sicherstellt, dass die Datei nach dem Verschieben in das Zielverzeichnis gelangt - das Problem ist, dass ich manchmal zu der Prüfung komme, bevor die Datei sich bewegt:

%Vor%

Kann mir jemand sagen, wie ich sicherstellen kann, dass die Datei tatsächlich an das Ziel gelangt? - Die Dateien, die ich verschieben werde, könnten sehr groß sein - (Full HD MP4-Dateien von bis zu 2 Stunden)

Danke!

    
Mizmor 04.01.2013, 18:44
quelle

6 Antworten

7

Sie können Streams mit Aysnc Await verwenden, um sicherzustellen, dass die Datei vollständig kopiert wird.

So etwas sollte funktionieren:

%Vor%

Wenn Sie VS2010 verwenden, müssen Sie Async CTP installieren die neue Async / Await-Syntax

    
sa_ddam213 04.01.2013, 20:32
quelle
1

Sie können darauf achten, dass die Dateien aus dem ursprünglichen Verzeichnis verschwinden und bestätigen, dass sie tatsächlich im Zielverzeichnis angezeigt werden.

Ich hatte keine großartige Erfahrung mit Dateiwatchern. Ich würde wahrscheinlich den Thread, der den Zug erledigt, auf ein AutoResetEvent warten, während ein separater Thread oder Timer periodisch läuft Überprüfen Sie, ob die Dateien vom ursprünglichen Speicherort verschwinden, überprüfen Sie, ob sie sich am neuen Speicherort befinden, und führen Sie ggf. (abhängig von Ihrer Umgebung und Ihren Anforderungen) eine Konsistenzprüfung (z. B. MD5-Überprüfung) der Dateien durch. Sobald diese Bedingungen erfüllt sind, würde der "Checker" Thread / Timer das AutoResetEvent auslösen, so dass der ursprüngliche Thread fortschreiten kann.

Fügen Sie einige "Dies dauert viel zu lange" Logik in der "Checker".

    
Eric J. 04.01.2013 18:48
quelle
1

Warum verwalten Sie die Kopie nicht selbst, indem Sie Streams kopieren?

%Vor%     
spender 04.01.2013 20:13
quelle
0

Sehr wahrscheinlich möchten Sie, dass die Verschiebung in einem separaten Thread erfolgt, damit Sie die Ausführung Ihrer Anwendung nicht stundenlang anhalten.

Wenn das Programm nicht fortgesetzt werden kann, ohne dass die Verschiebung abgeschlossen ist, können Sie in regelmäßigen Abständen einen Dialog öffnen und den Verschiebe-Thread einchecken, um einen Fortschritts-Tracker zu aktualisieren. Dies gibt dem Benutzer eine Rückmeldung und verhindert, dass er sich fühlt, als wäre das Programm eingefroren.

Hier gibt es Infos und ein Beispiel: Ссылка

    
Chris 04.01.2013 19:24
quelle
0

Überprüfen Sie regelmäßig in einer Hintergrundaufgabe, ob die kopierte Datei Die Größe hat die Dateigröße der Originaldatei erreicht (Sie können Hashes hinzufügen, die zwischen den Dateien vergleichen)

    
Yaron Wittenstein 04.01.2013 20:55
quelle
0

Vor kurzem ähnliches Problem.

%Vor%

warte nicht, reagiere auf das Ereignis

    
Lucas 04.01.2013 21:33
quelle

Tags und Links