![]() |
IOResult stimmt nach WriteLn nicht!
aloha...
so langsam krieg ich die krise... in meinem programm sollen in einem txt file user daten gespeichert werden... wenn beim hinzufügen der daten (über writeln) ein fehler passiert soll eine fehlermeldung ausgegeben werden... soweit zur theorie... und hier ist jetzt mal der quellcode...
Delphi-Quellcode:
wenn ich mir nach dem WriteLn denn IOResult ausgeben lasse ist er auf 103...
function TAddPW_Form.fnAddPWtoTextFile(sPWLocation, sPassword, sUser : String) : Boolean;
var sPath, sRow : String; txtFile : TextFile; begin sPath := 'UserPWs\' + sUser + '_SPW.txt'; // Diese Datei Existiert nicht! sRow := sPWLocation + #9 + sPassword + #13; {$I-} AssignFile(txtFile, sPath); Append(txtFile); Writeln(txtFile, sRow); //Hier müsste ein Fehler auftreten ShowMessage(IntToStr(IOResult)); If IOResult <> 0 Then Begin fnAddPWtoTextFile := False; ShowMessage(IntToStr(IOResult)); End Else Begin fnAddPWtoTextFile := True; ShowMessage(IntToStr(IOResult)); End; CloseFile(txtFile); {$I+} end; in meiner If abfrage setzt er denn wert von fnAddPWtoTextFile aber trotzdem auf True!!! und zeigt mir in der nächsten messagebox einen IOResult = 0 an!!! Hab ich irgendwas falsch gemacht??? meiner meinung nach müsste ich ja einen False wert in fnAddPWtoTextFile erhalten!!! und mich wundert es ausserdem warum sich der IOResult während der IF abfrage verändert! |
Re: IOResult stimmt nach WriteLn nicht!
Ähm, nur eine Idee: Wie wäe es, wenn du erst auf IOResult prüfst und wenn das in Ordnung ist in die Dati schreibst? die Variable IOREsult wird von Rewrite, Append, ... gesetzt und nicht von WriteLn.
|
Re: IOResult stimmt nach WriteLn nicht!
hmm ok werd ich mal probieren...
bist du dir sicher das das auch stimmt??? weil ich hab grad nach jeder aktion die ich mit dem txt file mach denn ioresult abgefragt... nach assign --> 0 nach append --> 2 nach writeln --> 103 nach close --> 103 aber ich probiers trotzdem ;) |
Re: IOResult stimmt nach WriteLn nicht!
Hi,
Zitat:
Delphi-Quellcode:
Gruß Hawkeye
code := IOResult;
if (code <> 0) then ShowMessage (IntToStr(code)); |
Re: IOResult stimmt nach WriteLn nicht!
Moin Andreas,
dass nach dem Assign kein Fehler auftritt: Logisch, denn hier wird nur intern die Dateivariable mit dem Pfad in Verbindung gebracht, und dass nach dem Append Fehler 2 auftritt ist auch logisch, da Du oben geschrieben hast, dass die Datei nicht existiert. Fehler 2: File not found. Mit Append kannst Du keine Dateien erzeugen. |
Re: IOResult stimmt nach WriteLn nicht!
@Hawkeye219
danke für denn beitrag ^^ der hat jetzt meine vermutung unterstützt!!! wenn ich gleich nach writeln denn ioresult abfrage kommt die fehlermeldung die ich erwartet hab :) danke für eure hilfe :thumb: |
Re: IOResult stimmt nach WriteLn nicht!
Zitat:
|
Re: IOResult stimmt nach WriteLn nicht!
es könnte ja theoretisch vorkommen das beim writeln ein fehler auftritt (ausser das die datei z.b. fehlt... weil die datei ist definitiv immer vorhanden!) von daher prüf ich writeln, wenn die datei fehlt oder ein anderer fehler auftritt meckert er aufjedenfall beim writeln...
|
Re: IOResult stimmt nach WriteLn nicht!
Luckie, jede I/O-Operation liefert ioresult, also auch writeln. :P
Error 103 : "Datei nicht für Schreiboperationen geöffnet" tödlich ist so was :
Delphi-Quellcode:
immer zwischenspeichern (writeln würde ioresult von sich selber anzeigen, wahrscheinlich 0) ! Z.B. so :
reset (f);
writeln (ioresult);
Delphi-Quellcode:
Showmessage dürfte es allerdings egal sein. Rest : siehe Luckie. Der $I- Block ist IMHO auch zu groß.
reset (f);
io := ioresult writeln (io); P.S.: Invasion der roten Kästen ? :shock: Lasse es trotzdem mal so stehen. |
Re: IOResult stimmt nach WriteLn nicht!
@Hansa: Ich hatte eben, al ich den Democode geschrieben habe, allerdings Exceptions von Writeln bekommen, weil ich die Dateivariable vergessen hatte. Das heißt, esw ird doch eine Exception in manchen Fällen ausgelöst:
Delphi-Quellcode:
var
f: Textfile; begin AssignFile(f, ChangeFileExt(ParamStr(0), '.txt')); {I-} Rewrite(f); {I+} if IOResult = 0 then begin try Writeln(f, 'Test'); except on E: Exception do ShowMessage(E.Message); end; CloseFile(f); end else ShowMessage(SysErrorMessage(GetLastError)); |
Re: IOResult stimmt nach WriteLn nicht!
@hansa
warum ist der
Delphi-Quellcode:
block zu gross???
{$I-}
|
Re: IOResult stimmt nach WriteLn nicht!
Du unterdrückst Fehlermeldungen in ca. 20 Zeilen. Lediglich in einer wird überhaupt auf ioresult geprüft. Überhaupt relevant sind nur ca. 2-3. Siehe Luckies Beispiel. So macht man das normalerweise. Denn : geht das rewrite gut, dann wird es mit writeln, Closefile usw. auch gut gehen, zumindest in 99,9999 % der Fälle. Falls das rewrite schon nicht geht, dann kann man auf den Rest solange verzichten, bis der Fehler beseitigt ist. Sonderfall wäre folgender (habe ich noch niemals irgendwo gesehen) : rewrite geht gut und anschließendes writeln oder Closefile nicht. In solchen Fällen MUSS eine Fehlermeldung kommen. Fehler wegzaubern, das nützt nichts. :P
P.S.: sehe gerade, Luckie hat den Compilerschalter {$I+} usw. zum Kommentar {I+} gemacht. Nicht, dass sich das noch einer 1:1 rauskopiert. :mrgreen: P.S.2 : Mittlerweile gesehen, dass die Datei in keiner Weise geöffnet wurde ? |
Re: IOResult stimmt nach WriteLn nicht!
@hansa
hmm ok des leuchtet ein :mrgreen: Zitat:
|
Re: IOResult stimmt nach WriteLn nicht!
Ne, ist schon richtig so. Habe das Append übersehen.
|
Re: IOResult stimmt unter Vista nicht!?
Kann es sein, dass diese Variante nicht unter Windows Vista funktioniert?
Speziell interessiert mich die Abfrage, ob z.B. in den Programmeordner geschrieben werden kann. Hier einmal die Kurzvariante zum Testen:
Delphi-Quellcode:
Bei den gewohnten Verzeichnissen, wie CD-Laufwerke, nicht beschreibbare Medien funktioniert es. Nur nicht unter Vista, wenn man als Nicht-Admin versucht ins Programmverzeichnis zu schreiben. Die angegebene Datei ist vor dem CloseFile() auch nicht vorhanden, obwohl ioresult=0 zurück gegeben wurde...
var
F : TextFile; tmp : integer; begin try AssignFile(F, Ordner + Dateiname); {$I-} ReWrite(F); {$I+} tmp := ioresult; if tmp = 0 then begin // erfolgreich showmessage('ioresult='+inttostr(tmp)); Result := true; CloseFile(F); end else begin // nicht erfolgreich showmessage('peng! ioresult='+inttostr(tmp)); Showmessage('In den angegebenen Ordner kann nicht geschrieben werden!'); Result := false; end; finally If FileExists(Ordner + Dateiname) then DeleteFile(Ordner + Dateiname); end; end; Ich verzweifle schon fast... :evil: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz