Überprüfung ob File.Move-Vorgang beendet wurde

16/01/2008 - 15:04 von Stefan Dirks | Report spam
Hallo NG,

ich muss eine Datei von einer relativ langsamen SD-Karte in ein Verzeichnis
auf der Festplatte verschieben und dann ebendiese Datei ausführen.

1 System.IO.File.Move(installPath & "\" & sfxFile, path &
"\" & sfxFile)
2 System.Threading.Thread.Sleep(10000)
3 Process.Start(path & "\" & sfxFile)

Wenn ich Zeile 2 auskommentiere, dann gibt es eine Exception, da die Datei
offensichtlich noch nicht vollstàndig ins Verzeichnis auf der Festplatte
kopiert wurde.
Bei mir auf dem Testsystem funktioniert's mit der Wartezeit von 10 Sekunden.
Gibt es vielleicht auch eine saubere Möglichkeit abzufragen, ob das
Verschieben der Datei beendet ist?
Ich hab's mit einer "File.Exists"-Überprüfung probiert, aber offensichtlich
gibt File.Exists auch dann schon ein "true" zurück, wenn die Datei noch
nicht vollstàndig übertragen wurde. Ich könnte in diesem Fall zwar auch eine
"File.Exists"-Überprüfung auf die Quelldatei durchführen, aber wenn die
Datei doch irgendwann mal aus welchem Grunde auch immer "nur" kopiert werden
sollte, stünde ich vor dem gleichen Problem...

Gruß
Stefan
 

Lesen sie die antworten

#1 Kerem Gümrükcü
16/01/2008 - 15:42 | Warnen spam
Hallo Stefan,

Gibt es vielleicht auch eine saubere Möglichkeit abzufragen, ob das
Verschieben der Datei beendet ist?



Mit Timern und Threading in diesem Fall zu arbeiten ist
grundlegend Falsch, da jedes System eine andere Zeit
für jede Anforderung benötigt, macnhmal enstcheiden
Millisekunden über Erfolg oder Fehlschlag!

Du kannst die Datei z.b in zeitlichen Abstànden versuchen
zu öffnen, da diese solange noch kopiert wird, nicht geöffnet
werden kann. Kannst Du sie öffnen, ist sie zu 100% da! Es
gibt im UserMode keine 100% saubere Möglichkeit,
zumindest ist mir keine bekannt, selbst im Kernel Mode
isrt das nicht 100% sauber machbar, da Du auf IR Pakete
und besondere Anforderungen warten musst, wie z.B. die
IRP's IRP_MJ_CLOSE.

Du kannst aber auch dein eigenes File.Move schreiben,
in dem Du jeh nach wunsch, Synchron oder Asynchron,
die Datei in der Quelle zum lesen öffnest, dann eine
Datei auf der Zeilplatte mit dem gleichen Namen anlegst
und den Inhalt der Datei kopierst, z.B. mit einem FileStream
und bei Abschluss löschst Du die Quelldatei und gibst eine
Rückmeldung (Event) "FileMove_Fnished" oder so was,...

Das wàre eine prima Lösung und die könntest Du auch
generisch schreiben, also so, das Du ne Klasse hast, die
Du überall benutzen kannst,...nur mal so als Idee,...

Mir fallen noch viele Sachen ein, aber die ist gut,...

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Microsoft Live Space: http://kerem-g.spaces.live.com/
Latest Open-Source Projects: http://entwicklung.junetz.de
"This reply is provided as is, without warranty express or implied."

Ähnliche fragen