Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateien und Exceptions (https://www.delphipraxis.net/18939-dateien-und-exceptions.html)

SiouX 26. Mär 2004 11:33


Dateien und Exceptions
 
Hallo,

trotz einiger Tutorials, komme ich mit Dateien & Exceptions nicht klar. z.B. ich möchte eine Datei einlesen. Wie schachtele ich da try.. except & try.. finally ?

Delphi-Quellcode:
procedure DateiEinlesen(Pfad: String; var Datensatz: String);
begin
   AssignFile(Datei,Pfad);
   try
      try
       Reset(Datei);
       read(Datei, Datensatz);
      except
       showmessage('fehler beim lesen');
      end;
      closeFile(Datei); //sollte ich das nicht lieber mit try..finally behandeln? wo? wie kann ich das ganze sinnvoll schachteln?
   except
      showmessage('Kann Datei nicht öffnen');
   end;
end;
im Programm
Delphi-Quellcode:
DateiEinlesen(Dateipfad, Inhalt);
DoSomething(Inhalt); //(*1)
zu (*1) Wenn in DateiEinlesen Fehler aufgetreten sind, dann hat Inhalt evtl. keinen vernünftigen 'Inhalt'? Sollte ich daher DateiEinlesen als Funktion deklarieren mit einem booleschen Rückgabewert oder wird sowas auch durch exceptions verhindert?

Danke :)

Luckie 26. Mär 2004 11:37

Re: Dateien und Exceptions
 
Delphi-Quellcode:
Assignfile(F, Filename);
{$I-}
Reset(F);
if IOResult = 0 then
begin
  // was mit Datei machen
end
else
  ShowMessage('Fehler beim Öffnen der Datei.');
CloseFile(F);
{$I+}
So geht es ohne Exceptions und try-finally.

SiouX 26. Mär 2004 11:43

Re: Dateien und Exceptions
 
Danke Luckie :) , ich muss es aber lt. Aufgabenstellung mit Exceptions machen :( .

Diese Compiler-Schalter {I+} bzw {I-} .. muss man die immer IN der Prozedur schreiben oder gilt es für alle Prozedur/Funktionen in der Unit, wenn man es direkt unter implementation schreibt?

Dannyboy 26. Mär 2004 11:44

Re: Dateien und Exceptions
 
Hallo SiouX,
sieh Dir mal in der Delphi-Hilfe TFileStream an oder gleich hier, ist viel einfacher und moderner als das Dateihandling unter Pascal.
Yo, ansonsten machst Du das schon ganz gut, bis auf eine Kleinigkeit:
Delphi-Quellcode:
procedure DateiEinlesen(Pfad: String; var Datensatz: String);
begin
   AssignFile(Datei,Pfad);
   try
       Reset(Datei);
       read(Datei, Datensatz);
      except
       showmessage('fehler beim lesen');
      end;
   // anderer Fehler möglich, ergo anderer TryBlock
   try    
      closeFile(Datei);  
except
      showmessage('Kann Datei nicht öffnen');
   end;
end;
Greetz DANNYBOY

SiouX 26. Mär 2004 11:54

Re: Dateien und Exceptions
 
@Dannyboy
hmm.. was für ein Fehler z.b.? Ob die Datei formal korrekt ist (existiert, Endung, Größe) prüfe ich vorher oder meinst du ganz was anderes?

Dannyboy 26. Mär 2004 12:08

Re: Dateien und Exceptions
 
Bei meinem oberen Try-Except werden Lesefehler abgefangen und beim
unteren ein eventueller Fehler beim Schließen (ist mir allerdings
noch nie passiert). Dein Beispiel macht inhaltlich exakt das Selbe,
nur wenn Du Deine Routinen noch weiter ausbaust und dann mehrere
dieser Try-Except Blöcke hast, dann würde ich sie wegen der Übersicht
nicht schachteln, sondern sequentiell unter einander schreiben.

Zu Deiner anfänglichen Frage:
Ein Finally wird auf jeden Fall ausgeführt, also auch im Falle eines
Fehlers, deswegen kommt das in Deinem Beispiel nicht in Frage.
Wenn die Datei nicht geöffnet werden kann, dann soll sie NICHT geschlossen
werden (da sie bereits geschlossen ist), ergo Except.

Wie Luckie aber schon sagte: Die Try-Catch-Blöcke sind in diesem
Beispiel optional, wenn Du die Compilermeldungen mit {$I-} und {$I+}
ausschaltest. Mit Filestreams ist das alles leichter. Ich komme
auch aus der Pascal-Ecke und habe mich anfangs davor gescheut, aber
das ist meines Erachtens noch einfacher als das Verarbeiten von Dateien
mit den Pascal-Routinen

Ricane 11. Apr 2004 13:29

Re: Dateien und Exceptions
 
Hi,

ich habe ein ähnliches Problem... mit folgendem Code arbeite ich...

Delphi-Quellcode:
Procedure TFrmMain.Suchen();
Var

  I, Posi: Integer;
  Datei: File Of Byte;

Begin

  For I := 1 To lstAllFiles.Items.Count - 1 Do
  Begin
    AssignFile(Datei, LstAllFiles.Items[I]);
    Reset(Datei);

    [...]

    DateiSize.Add(IntToStr(FileSize(Datei)));
    CloseFile(Datei);
  End;

End;
Das funktioniert auch ganz gut, aber aber wenn die Datei schreibgeschützt ist, gibt es eine Exception ("Zugriff verweigert"). Warum?! AssignFile setzt doch eh nur ReadOnly oder wie sehe ich das ?!


Beste Grüsse und frohe Ostern,

Ricane

Christian Seehase 11. Apr 2004 13:53

Re: Dateien und Exceptions
 
Moin Ricane,

AssignFile ist borlandspezifisch und macht eigentlich nicht mehr als, als intern eine Zuordnung zwischen der File Variablen und dem Dateipfad herzustellen.

Entscheidend ist hier Reset, denn diese Prozedure verwendet zum Öffnen der Datei den Modus, der in der Variablen FileMode gespeichert ist. Dies ist standardmässig Read/Write, so dass der Zugriff auf eine schreibgeschützte Datei fehlschlagen muss.

Du müsstest nur die FileMode Variable auf fmOpenRead setzen, bevor Reset aufgerufen wird.
Dann sollte es funktionieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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