AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Datei öffnen per API-CreateFile funktioniert nicht bei CD's?
Thema durchsuchen
Ansicht
Themen-Optionen

Datei öffnen per API-CreateFile funktioniert nicht bei CD's?

Ein Thema von devidespe · begonnen am 19. Apr 2010 · letzter Beitrag vom 19. Apr 2010
Antwort Antwort
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#1

Datei öffnen per API-CreateFile funktioniert nicht bei CD's?

  Alt 19. Apr 2010, 18:28
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;
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 18:33
CDs sind nun mal readonly
Markus Kinzler
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 18:36
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 18:39
Lass mal GENERIC_WRITE weg
Markus Kinzler
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#5

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 18:40
Lass mal

GENERIC_WRITE weg.
Lars
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#6

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 18:41
Zitat von devidespe:
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.
CreateFile erzeugt ein File-Handle ... was genau mit der Datei gemacht wird, entscheiden die Parameter.

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));
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 19:12
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?
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#8

Re: Datei öffnen per API-CreateFile funktioniert nicht bei C

  Alt 19. Apr 2010, 19:33
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 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