Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi IOResult stimmt nach WriteLn nicht! (https://www.delphipraxis.net/83100-ioresult-stimmt-nach-writeln-nicht.html)

Andidreas 27. Dez 2006 14:26


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:
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;
wenn ich mir nach dem WriteLn denn IOResult ausgeben lasse ist er auf 103...
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!

Luckie 27. Dez 2006 14:31

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.

Andidreas 27. Dez 2006 14:36

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 ;)

Hawkeye219 27. Dez 2006 14:42

Re: IOResult stimmt nach WriteLn nicht!
 
Hi,

Zitat:

Zitat von Delphi-Hilfe
Durch den Aufruf von IOResult wird das interne Fehler-Flag gelöscht.

Du mußt also das Ergebnis des Aufrufs von IOResult speichern, dann kannst du es prüfen und bei Bedarf ausgeben.

Delphi-Quellcode:
code := IOResult;
if (code <> 0) then
  ShowMessage (IntToStr(code));
Gruß Hawkeye

Christian Seehase 27. Dez 2006 14:43

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.

Andidreas 27. Dez 2006 14:44

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:

Luckie 27. Dez 2006 14:51

Re: IOResult stimmt nach WriteLn nicht!
 
Zitat:

Zitat von Andidreas
wenn ich gleich nach writeln denn ioresult abfrage kommt die fehlermeldung die ich erwartet hab :)

Warum erst warten bis das Kind in den Brunnen gefallen ist? Warum nicht vorher IOResult prüfen und in Abhängigkeit davon schreiben oder nicht?

Andidreas 27. Dez 2006 14:58

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...

Hansa 27. Dez 2006 15:01

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:
reset (f);
writeln (ioresult);
immer zwischenspeichern (writeln würde ioresult von sich selber anzeigen, wahrscheinlich 0) ! Z.B. so :

Delphi-Quellcode:
reset (f);
io := ioresult
writeln (io);
Showmessage dürfte es allerdings egal sein. Rest : siehe Luckie. Der $I- Block ist IMHO auch zu groß.

P.S.: Invasion der roten Kästen ? :shock: Lasse es trotzdem mal so stehen.

Luckie 27. Dez 2006 15:11

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));

Andidreas 27. Dez 2006 17:15

Re: IOResult stimmt nach WriteLn nicht!
 
@hansa

warum ist der
Delphi-Quellcode:
{$I-}
block zu gross???

Hansa 27. Dez 2006 17:30

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 ?

Andidreas 27. Dez 2006 17:58

Re: IOResult stimmt nach WriteLn nicht!
 
@hansa

hmm ok des leuchtet ein :mrgreen:

Zitat:

Zitat von Hansa
P.S.2 : Mittlerweile gesehen, dass die Datei in keiner Weise geöffnet wurde ?

meinst du mein code bsp. damit was ich gepostet hab???

Hansa 27. Dez 2006 18:12

Re: IOResult stimmt nach WriteLn nicht!
 
Ne, ist schon richtig so. Habe das Append übersehen.

amigage 3. Apr 2007 17:52

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:
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;
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...

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