Delphi-PRAXiS
Seite 1 von 5  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Fehler beim überschreiben von Datei (https://www.delphipraxis.net/159755-fehler-beim-ueberschreiben-von-datei.html)

EWeiss 11. Apr 2011 17:28

Fehler beim überschreiben von Datei
 
Wenn ich meine Datei die vorher mit hFile geschlossen wurde
überschreiben will bekomme ich einen EInOut Error


Delphi-Quellcode:
  myFile := SKAERO_SaveFileDialog(MainHandle, 'MidiTracker files (*.mtf*)|*.mtf*', 'mtf', 'MidiTrackerFile');
  AssignFile(f, myFile);
  Rewrite(f);
Der Fehler tiritt in der Zeile Rewrite(f); auf.

Was mache ich falsch?

Geschlossen wird es korrekt.
Delphi-Quellcode:
procedure FClose(var hFile: Cardinal);
begin
    if hFile <> 0 then
      CloseHandle(hFile);

    hFile := 0;

end;

gruss

s.h.a.r.k 11. Apr 2011 17:45

AW: Fehler beim überschreiben von Datei
 
Was genau für ein Fehler? Da gibts doch immer eine Nummer, oder? :)

EWeiss 11. Apr 2011 17:55

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von s.h.a.r.k (Beitrag 1094478)
Was genau für ein Fehler? Da gibts doch immer eine Nummer, oder? :)

I/O Error 32 // << Datei ist belegt. Dateiname ist möglicherweise bereits vorhanden und geöffnet.

Meinst das ? ;)

Ist aber geschlossen.

EDIT:
Fülle den Buffer
Delphi-Quellcode:
FBuffin(MidiTrackerFile);
Delphi-Quellcode:
procedure FBuffin(FileName: string);
var
  sBuffer: string;

begin

  if not FExist(FileName) then Exit;
    nErrCode := FOpen(FileName, 0, 2, myFile);
  if nErrCode <> 0 then exit;
    nReading := 0;

  Assignfile(ParseFile, FileName);
  reset(ParseFile);

  while not eof(ParseFile) do
  begin
    ReadLN(ParseFile, sBuffer);
    FSeekTo(nReading, sBuffer);
    inc(nReading);
  end;

end;
Dann öffne ich die Datei und setze die Zugriffsrechte
Delphi-Quellcode:
FOpen(FileName, 0, 2, myFile);

Nur Lesen
0= AccessIs := GENERIC_READ;
Schreibzugriff verweigern.
2= ShareIs := FILE_SHARE_READ

Nach dem einlesen der datei wird alles wieder geschlossen und auf nil gesetzt
Delphi-Quellcode:
  // MidiTrackerFile schließen
  FClose(myFile);

  FPBuffer := nil;
  FToPBuffer := nil;
  Result := True;
Theoretisch dürfte jetzt kein zugriff auf die Datei mehr vorhanden sein.
Aber trotzdem kann ich sie nicht überschreiben.
Die Zugriffsrechte dürften dann keinen Einfluss mehr auf die Datei haben
nach dem schließen.

gruss

himitsu 11. Apr 2011 18:11

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von EWeiss (Beitrag 1094474)
Was mache ich falsch?

Geschlossen wird es korrekt.

Du öffnest über Pascal-Routinen und schließt über die WinAPI?

Warum nicht
Delphi-Quellcode:
CloseFile(f);
?

EWeiss 11. Apr 2011 18:23

AW: Fehler beim überschreiben von Datei
 
Zitat:

Zitat von himitsu (Beitrag 1094485)
Zitat:

Zitat von EWeiss (Beitrag 1094474)
Was mache ich falsch?

Geschlossen wird es korrekt.

Du öffnest über Pascal-Routinen und schließt über die WinAPI?

Warum nicht
Delphi-Quellcode:
CloseFile(f);
?

Siehe mein EDIT!

gruss

Klaus01 11. Apr 2011 18:39

AW: Fehler beim überschreiben von Datei
 
Delphi-Quellcode:
 if not FExist(FileName) then Exit;
    nErrCode := FOpen(FileName, 0, 2, myFile);
Hallo Emil,

Du öffnest die Datei immer mit FOpen
schliesst sie aber nie mit z.B. mit FClose.

Reset öffnet die (Text)Datei zum Lesen - das scheint ja noch in Ordnung zu sein.
Da die Datei mit
0= AccessIs := GENERIC_READ;
Schreibzugriff verweigern.
2= ShareIs := FILE_SHARE_READ
geöffnet wurde.

Rewrite öffnet die Datei zum Schreiben - da kracht es weil die Datei nur zum Lesen geöffnet wurde.

Grüße
Klaus

EWeiss 11. Apr 2011 18:48

AW: Fehler beim überschreiben von Datei
 
Zitat:

schliesst sie aber nie mit z.B. mit FClose.
Und wie nennst du das ?

Delphi-Quellcode:
  // MidiTrackerFile schließen
  FClose(myFile);

  FPBuffer := nil;
  FToPBuffer := nil;
  Result := True;
Ist das ein Vielleicht FClose?

Zitat:

Rewrite öffnet die Datei zum Schreiben - da kracht es weil die Datei nur zum Lesen geöffnet wurde.
Wie kann ein Rewrite einfluss auf eine geschlossenen Datei haben ?
Siehe FClose....

Die zugriffsrechte haben dann keine Bedeutung mehr.
Es sei denn das schließen des Handle allein genügt nicht!
Und die Datei ist mehr oder weniger immer noch offen.

Oder aber die zugriffsrechte werden in die Datei gespeichert!
Dann wäre es verständlich wenn sie sich nicht überschreiben läßt.

grrr....

gruss

rollstuhlfahrer 11. Apr 2011 19:50

AW: Fehler beim überschreiben von Datei
 
wäre es nicht mal sinnvoll, einen größeren Teil des Quellcodes auszupacken? - Zumindest mit dem Teil hier habe ich so meine Probleme:
Zitat:

Zitat von EWeiss
Delphi-Quellcode:
procedure FBuffin(FileName: string);
var
  sBuffer: string;

begin

  if not FExist(FileName) then Exit;
    nErrCode := FOpen(FileName, 0, 2, myFile);
  if nErrCode <> 0 then exit;
    nReading := 0;

  Assignfile(ParseFile, FileName);
  reset(ParseFile);

  while not eof(ParseFile) do
  begin
    ReadLN(ParseFile, sBuffer);
    FSeekTo(nReading, sBuffer);
    inc(nReading);
  end;

end;

Du öffnest die Datei eimal über dein FOpen und direkt danach ein 2. Mal über AssignFile/Reset (also Pascal-Routinen). Bis zu dem Ende der Routine wird die Daei 0x wieder geschlossen, also müsste sie danach 2x auf sein. Außerdem finde ich es sehr schlecht, Datei-Handles als globale (nicht-lokale) Variablen zu wählen, da falls die Routine noch mal aufgerufen wird, bevor die Datei geschlossen wurde (und zwar 2x) ist die erste Datei noch auf und die 2. Datei überschreibt ALLE Referenzen. Eventuell ein Struktur-Problem?

Bernhard

EWeiss 11. Apr 2011 20:14

AW: Fehler beim überschreiben von Datei
 
Zitat:

ein 2. Mal über AssignFile/Reset (also Pascal-Routinen).
Danke habe ich auch gerade bemerkt als ich meine zeilen nochmal überflogen habe.

Globale Variablen habe ich rausgeschmissen und deklariere sie nun in meiner procedure direkt.

Ich glaube den Mist habe ich vor langer zeit mal selbst verzapft.
Ich denke weil ich zu der zeit (und immer noch nicht weis) wie ich hFile durch
eine EOF schleife laufen lassen kann.

Das ich die Datei dadurch 2 mal öffne ist mir nicht wirklich aufgefallen.

EDIT:
Sehe gerade kann hFile gar nicht mit EOF öffnen da EOF zu Pascal und hFile zur Win32 Api gehört.
grrr.. muss dann wieder alles umschreiben.

Ok geht jetzt..
Habe meine procedure umgeschrieben.

Delphi-Quellcode:
procedure FBuffin(FileName: string);
var
  sBuffer: string;
  f     : TextFile;
begin

  if not FExist(FileName) then
    Exit;

  Assignfile(f, FileName);
  reset(f);

  while not eof(f) do
  begin
    ReadLN(f, sBuffer);
    FSeekTo(nReading, sBuffer);
    inc(nReading);
  end;

  CloseFile(f);

end;
Die Datei dann nochmals über hFile zu öffnen macht dann nicht wirklich sinn.

gruss

Klaus01 11. Apr 2011 20:42

AW: Fehler beim überschreiben von Datei
 
Hallo Emil,

ich würde die FBuffin Procedure so umbauen,
dass die Datei darin geöffnet und auch geschlossen wird.

Delphi-Quellcode:
procedure FBuffin(FileName: string; {var hFile: THandle});
var
  sBuffer: string;
  f : TextFile;
  hFile : THandle;
begin

  if not FExist(FileName) then Exit;

  nErrCode := FOpen(FileName, 2, 4, hFile); // Was willst Du damit bewecken? 
                                             // Nur einen ErrorCode bekommen?

  if nErrCode <> 0 then exit;              

  nReading := 0;

  Assignfile(f, FileName);
  {$I -}
  reset(f);
  {$I +}

  if IOResult = 0 then
    begin
      while not eof(f) do
        begin
         ReadLN(f, sBuffer);
         FSeekTo(nReading, sBuffer);
         inc(nReading);
        end;
      closeFile(f);
    end;
  fClose(hFile);
end;
So weit ich gesehen habe, wird die Variable hFile nicht
in der Routine ParsetoMidiTracker verwendet (ausser für fClose).

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:01 Uhr.
Seite 1 von 5  1 23     Letzte »    

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