Win2000 und schreiben aus USB-Stick
-
Hallo zusammen
In meinem aktuellen Projekt will ich unter Windows 2000 Prof Dateien auf einen USB-Stick kopieren. Da der Stick als Laufwerk direkt eingebunden wird, stellt das auch kein Problem dar (mit CopyFile).
In einer Schleife kopiere ich die Dateien und merke mir, welche kopiert wurden. Wenn nun der Bediener während des Kopierens den Stick entfernt, will ich anzeigen, welche kopiert wurden (bzw. markieren, welche nicht kopiert wurden).
Dabei kommt mir anscheinend ein Cache des Sticks in die Quere. Denn wenn mir CopyFile meldet, dass die Datei kopiert wurde, heißt das noch nicht, dass diese auch wirklich auf dem Stick ist.
Daher sehe ich zwei Lösungswege, bei denen ich leider nicht weiß, wie ich diese umsetzen kann:
A: In meiner Schleife müsste ich das OS anweisen, nach jedem Dateikopiervorgang den Cache zu leeren. Nur so kann ich sichergehen, dass die Datei auch wirklich schon auf dem Stick ist. Leider weiß ich nicht, wie ich das realisieren kann.
B: Ich schalte auf dem Zielsystem diesen Cache aus, so dass alle Dateien immer direkt geschrieben werden. Leider konnte ich bisher nur in Erfahrung bringen, dass es dafür unter WinXP eine Menüeinstellung gibt. Diese ist nicht unter Win2000Prof enthalten. Daher bräuchte ich wohl eine Registryeinstellung o.Ä.. Zudem wäre dieses die schlechtere Lösung, da es für die Haltbarkeit der Sticks schlecht wäre, immer direkt zu schreiben.
Achso, falls euch noch eine andere Lösung einfällt, dann immer her damit.
Mit freundlichen Grüßen
DarkGuardian
-
Nachtrag:
Natürlich soll der Titel "Win2000 und schreiben auf USB-Stick" lauten.
Zudem besteht ein Crossposting zu einem anderen Forum:
http://www.spotlight.de/zforen/cpp/m/cpp-1202463627-31195.html
-
C: Deine eigene Kopiermethode schreiben und nicht CopyFile. Exception abfangen und schon weisst du, ob die Datei auch auf dem Stick komplett angekommen ist.
-
Die Mühe würde ich mir gar nicht machen. Außerdem, was soll es bringen, eine eigene Kopierroutine zu schreiben? Der Cache wird dadurch nicht umgangen. Wenn die Exception geworfen wird, kannst Du nicht wissen, welche Dateien schon geschrieben waren und welche noch im Cache lagen.
Wenn der User blöd genug ist, den Stick während des Kopiervorgangs zu ziehen, muss er eben damit leben, dass der Kopiervorgang komplett von vorne begonnen wird.
-
Ich befürchte auch, dass eine eigene Kopierfunktion das Problem nicht löst. Schließlich wird der Cache von Win 2000 umgesetzt.
Allerdings würde ich schon gerne anzeigen, welche Dateien kopiert wurden. Gibt es denn dabei nicht doch irgendeine Lösung, wie ich das Schreiben erzwingen kann?
Allgemein könnte ich ja nach jeder Datei den Stick unmounten und danach wieder mounten. Dann muss das OS die Daten wegschreiben. Allerdings halte ich das für ein sehr umständliches Vorgehen und ich weiß auch noch nicht wie Win2000 darauf genau reagiert (Hinweisfenster o.Ä.). Ansich würde eine Funktion wie void LeereCache() bevorzugen. Kennt jemand soetwas?
-
Hallo,
Vielleicht hilft dir das hier weiter.
FlushFileBuffers
-
Hallo Braunstein
Danke für den Link. Leider komme ich diese Woche nicht mehr dazu, dass auszuprobieren, aber es klingt auf jeden Fall gut.
Ich werde berichten, ob das funktioniert.
-
Hallo
@ Braunstein : Las einfach das (VS.85) weg dann stimmt die URL wieder. Das Problem hat ich mit einem link aus der MSDN schon mal. Keine Ahnung was das VS zu bedeuten hat.
bis bald
akari
-
Danke, jetzt geht es.

-
Vielleicht hilft dir auch die Funktion CopyFileEx weiter, in deren Callback Funktion kannst du nämlich prüfen, wieviele Bytes bis dato tatsächlich kopiert wurden. Kann man dann auch für eine Progressbar verwenden, um den Status der einzelnen Dateien grafisch darzustellen.
mfg
-
Nun habe ich verschiedene Möglichkeiten getestet und möchte meine Erfahrungen dazu zurückgeben.
CopyFileEx:
Ansich eine gute Idee, da ich somit eine direkte Rückmeldung über den Fortschritt erhalte. Leider sieht es so aus, dass ich den Fortschritt der Dateiübertragung von HDD in den Cache erhalte. Damit kann ich mein Problem natürlich nicht lösen.Trotzdem danke für den Hinweis, denn diese Funktion kann ich an anderer Stelle später gut gebrauchen (die kannte ich noch nicht).
FlushFileBuffers:
Ansich ist es mit dieser Funktion möglich den Cache für das Schreiben einer Datei zu leeren. Das klappt in den meisten Fällen auch sehr gut. Es kommt aber bei größeren Dateien vor, dass das OS den Cache selbst leert. Wenn in diesem Fall der Stick aber genau vor dem Flush entfernt wird, ist für die SW die Datei noch nicht übertragen. Auf dem Stick ist sie aber enthalten.Dadurch entsteht ein inkonsistenter Zustand, den ich ja unbedingt vermeiden will / muss. Es trifft auch nur in seltenen Fällen zu, aber das reicht mir nicht. Daher werde ich den Vorgang als abgebrochen ansehen, wenn der Bediener den Stick vor Ende entfernt. Somit muss er diesen komplett neu starten.
Zwar wäre das andere eine schönere Lösung gewesen, aber ich sehe nicht viel Sinn darin, für ein solch kleines Detail so viel Aufwand zu betreiben. Vielleicht nehme ich das später doch mal auf. Aber momentan steht dem Aufwand ein viel zu geringen Nutzen gegenüber (zumindest wenn man vom Lernwert absieht).
Trotzdem danke euch allen.
-
Hab ich doch gleich gesagt.
