AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Fehler beim überschreiben von Datei
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler beim überschreiben von Datei

Ein Thema von EWeiss · begonnen am 11. Apr 2011 · letzter Beitrag vom 12. Apr 2011
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 18:39
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
Klaus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 18:48
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

Geändert von EWeiss (11. Apr 2011 um 19:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von rollstuhlfahrer
rollstuhlfahrer

Registriert seit: 1. Aug 2007
Ort: Ludwigshafen am Rhein
1.529 Beiträge
 
Delphi 7 Professional
 
#3

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 19:50
wäre es nicht mal sinnvoll, einen größeren Teil des Quellcodes auszupacken? - Zumindest mit dem Teil hier habe ich so meine Probleme:
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
Bernhard
Iliacos intra muros peccatur et extra!

Geändert von rollstuhlfahrer (11. Apr 2011 um 19:51 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 20:14
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

Geändert von EWeiss (11. Apr 2011 um 21:00 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.757 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 20:42
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
Klaus
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 20:49
FOpen(FileName, 2, 4, hFile);
Nein ich wollte die datei mit Zugriffsrechten öffnen.
Das war der einzige Sinn und zweck..

Scheinbar ist mir da ein Denkfehler unterlaufen.

Habe es jetzt so gelößt..

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;
Danke für eure Hilfe

gruss
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 21:00
Dieses Snippet ist so nicht sicher...
Was ist, wenn aus welchen Gründen auch immer in der Schleife ein Fehler auftritt? In diesem Fall wird das Filehandle nicht geschlossen, dh. CloseFile(f); wird nicht unbedingt aufgerufen. Im weiteren Programmfluss könnte das zu Bugs führen!
Daher packe das bitte in ein Try-Finally Konstrukt!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Fehler beim überschreiben von Datei

  Alt 11. Apr 2011, 21:04
ich würde da noch eine Fehlerbehandlung einbauen. Sonst wunderst du dich irgendwann warum nichts passiert und suchst dich wieder dumm und dämlich.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 04:16 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