Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Betriebssysteme (https://www.delphipraxis.net/27-betriebssysteme/)
-   -   Vista: Datei schreiben auf Wechseldatenträger (https://www.delphipraxis.net/101339-vista-datei-schreiben-auf-wechseldatentraeger.html)

ChrisE 11. Okt 2007 15:53


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

mkinzler 11. Okt 2007 15:56

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!

OregonGhost 11. Okt 2007 15:58

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.

ChrisE 11. Okt 2007 16:04

Re: Vista: Datei schreiben auf Wechseldatenträger
 
Zitat:

Zitat von OregonGhost
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.

Ganz genau. Siehe P.S. vom ersten Post -> für schnelles entfernen optimieren

Zitat:

Zitat von mkinzler
das Problem ist dass, die daten nicht sofort geschrieben werden. Wechseldatenträger nach Schreibzugriffen immer Auswerfen oder etwas Warten!

Das kurze warten alleine reicht irgendwie nicht. Gibt es eine Möglichkeit Abzufragen, ob die Daten geschrieben sind. So auf die Art:
Delphi-Quellcode:
// nicht sehr schön aber so in der Art
while DeviceNotReady do Application.ProcessMessages;
Gruß, Chris

OregonGhost 11. Okt 2007 16:15

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.

ChrisE 11. Okt 2007 16:17

Re: Vista: Datei schreiben auf Wechseldatenträger
 
Nochmals zur Verdeutlichung:
Delphi-Quellcode:
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);
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.
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:

Zitat von OregonGhost
Sowas, das hatte ich tatsächlich überlesen. Hatte aber mit meinen Karten / USB-Sticks das Problem noch nicht.

Keine Problem. Überlesen ist nicht schlimm. Du willst wenigstens helfen :-)

ChrisE 12. Okt 2007 09:08

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;
IOCTL_STORAGE_EJECT_MEDIA sorgt dafür, dass der Fehler nicht mehr auftritt. Problem war, dass ein Zugriff auf das Medium danach nicht mehr möglich ist. Der Anwender wäre gezwungen die SD-Karte raus zu ziehen und wieder ein zu stecken.
FSCTL_DISMOUNT_VOLUME hat den richtigen Effekt. Der Datenträger wird beim nächsten Zugriffsversuch automatisch vom System wieder gemountet.
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 01:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz