AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

E/A Fehler 103 beim Assignfile

Ein Thema von TM6 · begonnen am 11. Jul 2023 · letzter Beitrag vom 12. Jul 2023
Antwort Antwort
TM6

Registriert seit: 14. Dez 2004
50 Beiträge
 
Delphi 12 Athens
 
#1

E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 14:27
Delphi-Version: 5
Ich habe hier ein Problem, welches ich nicht verstehe.
Ich versuche zu testen, ob ich eine Datei schreiben kann.

Code:
var
  lFile            : file     ;
begin
  if not FileExists( pDateiName ) then
    exit;

  FileMode := fmOpenReadWrite;

  assignfile( lFile , pDateiName );

...
end;
Dabei erhalte ich schon beim AssignFile den I/O Error 103.

Wenn ich das per try ... except abfange und assignfile noch einmal aufrufe, dann funktioniert es.

Das Problem taucht nur auf, wenn ich vorher in einer anderen unit (vollkommen andere Datei) einen nicht erfolgreichen Aufruf (Res <> 0 ) in der folgenden Art hatte (Datei pPath war schreibgeschützt)

Code:
  AssignFile(  lTestFile , pPath );
  if IOResult = 0 then begin
    rewrite( lTestFile , 1 );
    Res := IOResult;
    CloseFile( lTestFile );
  end;
Wo ist hier der Fehler?
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#2

AW: E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 14:42
Ich habe hier ein Problem, welches ich nicht verstehe.
Ich versuche zu testen, ob ich eine Datei schreiben kann.

Code:
var
  lFile            : file     ;
begin
  if not FileExists( pDateiName ) then
    exit;

  FileMode := fmOpenReadWrite;

  assignfile( lFile , pDateiName );

...
end;
Dabei erhalte ich schon beim AssignFile den I/O Error 103.

Wenn ich das per try ... except abfange und assignfile noch einmal aufrufe, dann funktioniert es.

Das Problem taucht nur auf, wenn ich vorher in einer anderen unit (vollkommen andere Datei) einen nicht erfolgreichen Aufruf (Res <> 0 ) in der folgenden Art hatte (Datei pPath war schreibgeschützt)

Code:
  AssignFile(  lTestFile , pPath );
  if IOResult = 0 then begin
    rewrite( lTestFile , 1 );
    Res := IOResult;
    CloseFile( lTestFile );
  end;
Wo ist hier der Fehler?
Setz IOResult auf 0 bevor Du irgendwelche Dateioperationen machst, das ist sicherer. Noch besser: vergiss diese uralten Dateifunktionen und verwende TFilestream et al., da ist die Fehlerbehandlung wesentlich konsistenter.
Peter Below
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 14:43
Lass mal das CloseFile weg, wenn der IOResult einen Fehler meldet.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TM6

Registriert seit: 14. Dez 2004
50 Beiträge
 
Delphi 12 Athens
 
#4

AW: E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 15:07
Lass mal das CloseFile weg, wenn der IOResult einen Fehler meldet.
Das scheint zu funktionieren.
Ich wäre nicht auf die Idee gekommen, dass es daran liegen könnte.

In der Hilfe steht ja nur etwas von müssen und nicht dürfen:
Zitat:
Wenn ein E/A-Fehler auftritt, schließt Rewrite die Datei. Sie müssen CloseFile nicht aufrufen.

Danke!

Sollte man dann CloseFile allgemein nur situationsbedingt nutzen?
Ich habe noch zig Stellen im Code, an denen IOResult nicht ausgewertet wird.

Geändert von TM6 (11. Jul 2023 um 15:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 15:14
Kann es sein, dass vor dem AssignFile diese Datei-Variable einen "komischen" uninitialisierten Zustand besitzt?

Bist du dir sicher, dass der Fehler 103 wirklich aus dem AssignFile kam? (das kann eigentlich nicht sein)
[edit] Jupp, wie du schon sagtest, es gab vorher wo anders einen "letzten" Fehler,



IOResult ist immer der "letzte" Fehler, nicht der Status der letzten Ausführung.
Wenn etwas erfolgreich war, dann wird IOResult nicht auf 0 esetzt .... das müsstest du vorher selber machen.
Also genau das selbe Verhalten, wie beim GetLastError (auch wenn hier manche/zuviele Funktionen im Erfolgsfall es "bösartig" auf 0 setzen), und deswegen darf man es immer nur abfragen, wenn die Funktion vorher "Fehler" gesagt hat (niemals im Erfolgsfall).

AssignFile macht noch keine Dateizugriffe
und es liefert nur einen Fehler 3, wenn der übergebene Dateiname zu lang ist (MAX_PATH).



PS: Wie wäre es, wenn du dich von diesen "veralteten" Pascal-Funkionen verabschiedes und z.B. auf Streams umsteigst, oder auf anderes Objektorientiertes?
$2B or not $2B

Geändert von himitsu (11. Jul 2023 um 15:24 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#6

AW: E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 15:27
Du hast zwar den Fehler nach Rewrite mit dem Abruf von IOResult gelöscht, aber das CloseFile produziert dann eben einen weiteren Fehler, den du dann aber auch mit IOResult zurücksetzen solltest. Oder das CloseFile nach einem fehlgeschlagenen Rewrite eben gar nicht erst aufrufen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
TM6

Registriert seit: 14. Dez 2004
50 Beiträge
 
Delphi 12 Athens
 
#7

AW: E/A Fehler 103 beim Assignfile

  Alt 11. Jul 2023, 19:21
[S]
PS: Wie wäre es, wenn du dich von diesen "veralteten" Pascal-Funkionen verabschiedes und z.B. auf Streams umsteigst, oder auf anderes Objektorientiertes?
Wenn man dazu Zeit hätte... Es sind halt nicht nur ein paar Tausend Zeilen Code.
Ein "die Zeit muss man sich nehmen" hilft da leider auch nicht weiter.
Priorität dafür wäre aktuell gegen 0.
Aber ich schreibe es mir auf die Agenda.

Noch einmal Danke für die Hilfe und Erklärungen.

Edit:
Ich habe jetzt doch nochmal an vielen Stellen den Code untersucht. Die eigentlichen Schreibroutinen laufen fast immer über tFileStream ab.
Es handelte sich fast nur um vorgelagerten alten Code, um den Schreibzugriff vorab zu überprüfen. Eigentlich nicht einmal notwendig.

Geändert von TM6 (12. Jul 2023 um 09:51 Uhr)
  Mit Zitat antworten Zitat
TM6

Registriert seit: 14. Dez 2004
50 Beiträge
 
Delphi 12 Athens
 
#8

AW: E/A Fehler 103 beim Assignfile

  Alt 12. Jul 2023, 11:33
Hat zwar nicht direkt mit dem Thema zu tun, ist aber eine Folge einiger Tests.

Wenn ich hier eine Exception auslöse

Code:
try
  FileStream := TFileStream.Create( Path, fmCreate );
except
  ..
end;
dann erhalte ich eine "Benachrichtigung über Debugger-Exception" von Delphi.
Diese kann ich zwar pauschal über "Diesen Exception-Typ ignorieren" ausschalten. Aber nur pauschal.
Ist es eigentlich möglich, dies nur an bestimmten Stellen zu ignorieren?
Über $ irgendwas?

Möglicherweise war das der Grund der weiteren Nutzung von Assignfile, rewrite, ...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: E/A Fehler 103 beim Assignfile

  Alt 12. Jul 2023, 13:29
Nein.

Es gibt Addons, wo man z.B. auch auf den Message-Text filtern kann, also nicht nur auf die Exception-Klasse.

ansonsten
https://www.delphipraxis.net/211220-...markieren.html
https://quality.embarcadero.com/browse/RSP-18827

zusätzlich
https://quality.embarcadero.com/browse/RSP-41311



Das als Grund dafür, neeeeeeeeeee?

MSDN-Library durchsuchenCreateFile und das dann in ein Delphi-Referenz durchsuchenTHandleStream.

Via Ableitung oder per Class-Helper kann man es sich auch direkt in TFileStream oder THandleStream einfügen.
$2B or not $2B

Geändert von himitsu (12. Jul 2023 um 13:33 Uhr)
  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 00:56 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