![]() |
Datei öffnen per API-CreateFile funktioniert nicht bei CD's?
Ich verzweifle hier nochmal mit der Windows API. Es geht darum, dass ich eine auf CD befindliche temporäre Datei auf die Festplatte kopieren möchte, und dafür wollte ich die Windows API benutzen (unter anderem, weil ich später den Cache umgehen möchte - das ist aktuell aber zweitrangig). Nun scheitere ich insofern, dass CreateFile immer INVALID_HANDLE_VALUE zurückliefert. Wenn ich die temporäre Datei von einer lokalen Festplattenpartition öffne, funktioniert es ohne Probleme. Woran kann das liegen? Hier mal ein Code-Auszug:
Delphi-Quellcode:
var DateiPfad : PAnsiChar;
FDateiRead : THandle; begin DateiPfad:='g:\tempfile.txt'; {Laufwerk G ist das CD-Laufwerk, die Datei "tempfile.txt" existiert auf der eingelegten CD} FDateiRead:=CreateFile(DateiPfad, GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); if (FDateiRead = INVALID_HANDLE_VALUE) then ShowMessage('Fehler beim Öffnen der temporäten Datei aufgetreten.'); end; |
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
CDs sind nun mal readonly
|
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
Vielleicht verstehe ich das falsch, aber der Aufruf von CreateFile bedeutet doch eigentlich nicht, dass ich die Datei erstellen möchte. Ich dachte, mit "OPEN_ALWAYS" wird die Datei lesend geöffnet und ein Dateihandle erzeugt.
|
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
Lass mal GENERIC_WRITE weg
|
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
Lass mal
Delphi-Quellcode:
weg.
GENERIC_WRITE
|
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
Zitat:
Also bei dir wird die Datei im Lese-/Schreibzugriff geöffnet und wenn die Datei nicht existiert wird auch noch versucht Eine zu erzeugen. OPEN_ALWAYS = Datei versuchen zu öffnen und wenn nicht existent, dann versuchen zu erstellen CREATE_ALWAYS = immer neu erstellen (Existierendes überschreiben) CREATE_NEW = Datei neu erstellen, aber abbrechen, wenn datei schon existiert OPEN_EXISTING = nur öffnen (nur möglich, wenn Datei existiert) OPEN_ALWAYS = Schreibzugriff, aber eine CD ist nur ReadOnly, darum ist auch kein Schreibzugriff möglich
Delphi-Quellcode:
var DateiPfad: String;
FDateiRead := CreateFile(PChar(DateiPfad), GENERIC_READ, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); if FDateiRead = INVALID_HANDLE_VALUE then ShowMessage(SysErrorMessage(GetLastError)); |
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
Danke himitsu, ich werde das mal ausprobieren und dann Rückmeldung geben.
Wenn ich die Datei nun geöffnet habe und den Kopiervorgang ohne den Cache durchführen möchte, könnte man ja zusätzlich zu FILE_ATTRIBUTE_NORMAL noch FILE_FLAG_NO_BUFFERING verwenden. Würdest Du das genau so machen oder alternativ nach dem Schreibvorgang FlushFileBuffers aufrufen? Bin mir unsicher, welche Methode geeigneter wäre? |
Re: Datei öffnen per API-CreateFile funktioniert nicht bei C
zusätzlich zu FILE_ATTRIBUTE_NORMAL noch FILE_FLAG_NO_BUFFERING verwenden
A) nicht zusätzlich, sondern NUR FILE_FLAG_NO_BUFFERING > FILE_ATTRIBUTE_NORMAL wird nur verwendet, wenn sonst kein Flag gesetzt ist. B) FILE_FLAG_NO_BUFFERING muß man beim Zugriff aufpassen, denn MÜSSEN koplette Sektoren gelesen werden. > Solange die Datei kleiner ist, daß freier Platz in in der WindowsFileCache, ist der Zugriff mit Cache einfacher. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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