![]() |
Vista: Datei schreiben auf Wechseldatenträger
Hallo alle miteinander.
folgendes Problem: 1. SD-Karte mit Vista formatiert 2. Dateien im Explorer auf Karte ziehen 3. Mit einem Programm Dateien auf dieser Karte Anpassen (nur ein Byte verändern) - bis hier hin klappt alles - 4. Die Karte aus dem Slot ziehen und wieder einstecken -> Fehlermeldung von Vista. ########### Möchten Sie "MySD (G: )" überprüfen und reparieren? [Content] Es besteht eventuell ein Problem mit einigen Dateien auf diesem Gerät bzw. Datenträger. Dies kann auftreten, wenn ein Gerät bzw. Datenträger entfernt wird, bevor alle Dateien darauf geschrieben wurden. [Überprüfen und reparieren (empfohlen)] [Ohne Überprüfung fortsetzen] ########### Die Daten befinden sich aber auf der Karte (siehe Fehlermeldung). Die Dateien sind auch alle IO. Geh ich im Programm hin und sorge per DeviceIOControl dafür, dass der Datenträger "ausgeworfen" wird tritt die Fehlermeldung nicht auf. Jetzt möchte ich aber nicht jedesmal wieder die Karte neu Mounten bzw. von Hand hingehen Karte rein / raus (damit System sie Mountet). Was muss man tun (auser unmount) damit dieser Fehler nicht mehr auftritt. Unter XP geht dass ganze ohne Motzen und maulen. Auch wenn man die scheinbar fehlerhafte Karte (nach Aussage von Vista) dann in einen XP-Rechner schiebt. XP hat nichts daran aus zu setzten. Danke für Hilfe / Infos. Gruß Chris P.S.: Datenträger ist für schnelles entfernen optimiert |
Re: Vista: Datei schreiben auf Wechseldatenträger
das Problem ist dass, die daten nicht sofort geschrieben werden. Wechseldatenträger nach Schreibzugriffen immer Auswerfen oder etwas Warten!
|
Re: Vista: Datei schreiben auf Wechseldatenträger
Kann man nicht gerade für solche Dinge in den Eigenschaften des Laufwerks oder der Hardware oder so irgendwo ein Häkchen setzen, dass die Daten sofort geschrieben werden? Mir war so, als hätte ich das mal gesehen.
|
Re: Vista: Datei schreiben auf Wechseldatenträger
Zitat:
Zitat:
Delphi-Quellcode:
Gruß, Chris
// nicht sehr schön aber so in der Art
while DeviceNotReady do Application.ProcessMessages; |
Re: Vista: Datei schreiben auf Wechseldatenträger
Sowas, das hatte ich tatsächlich überlesen. Hatte aber mit meinen Karten / USB-Sticks das Problem noch nicht.
|
Re: Vista: Datei schreiben auf Wechseldatenträger
Nochmals zur Verdeutlichung:
Delphi-Quellcode:
Der Parameter FILE_FLAG_WRITE_THROUGH sollte eigentlich genau dafür sorgen, dass es sofort geschrieben wird. Es gibt ebenso noch den Parameter FILE_FLAG_NO_BUFFERING. Hierbei wird man dann gezwungen, in der Sektorengröße zu schreiben. Aber auch das bringt mich immer wieder zur selben Fehlermeldung.
FFileHandle := CreateFile(PAnsiChar(AFileName), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,
nil, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS or FILE_FLAG_WRITE_THROUGH, 0); Soll heißen, ich brauche die Möglichkeit, Windows Vista klar zu machen, dass ich jetzt fertig bin mit schreiben ( war eigentlich für mich immer CloseHandle) und dann die möglichkeit zu erfahren wann Windows wirklich fertig ist mit schreiben. Wobei ich nochmals sagen möchte: Die Veränderung in der Datei ist wirksam auf der Karte (trotz Fehlermeldung!) Gruß, Chris Edit: Zitat:
|
Re: Vista: Datei schreiben auf Wechseldatenträger
Hallo,
also ich habe da noch ein bisschen in Richtung DeviceIOContro weiter gesucht und das gefunden was ich wollte. Die Lösung sieht wie folgt aus (Die Funktion war hier irgendwo auch so im Forum bei einer Frage dabei). Jedes mal wenn man fertig ist mit schreiben und das typische CloseFile oder FileStream.Free kommt einfach noch folgender Aufruf:
Delphi-Quellcode:
function Umount(Laufwerk: Char): Boolean;
const IOCTL_STORAGE_EJECT_MEDIA = $2D4808; FSCTL_DISMOUNT_VOLUME = $90020; var hDrive: Cardinal; bytesRet: Cardinal; begin hDrive := CreateFile(PAnsiChar('\\.\' + Laufwerk + ':'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0); if hDrive <> INVALID_HANDLE_VALUE then begin DeviceIOControl(hDrive, FSCTL_DISMOUNT_VOLUME, nil, 0, nil, 0, bytesRet, nil); CloseHandle(hDrive); result := TRUE; end else result := FALSE; end; ![]() ![]() Das nur für die Leute, die irgendwann auch mal auf dieses Problem stoßen. Danke an alle. Gruß Chris |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz