Entwickler-Ecke
Sonstiges (Delphi) - Dateizugriff E/A-Fehler 32
audioexe - Do 25.03.10 19:42
Titel: Dateizugriff E/A-Fehler 32
Guten Abend liebe Leute,
ich habe ein mittelschweres Problem andem ich so langsam verzweifele.
Kurze Erklärung.
Ich habe ein Programm geschrieben, dass über eine exterene Datei den Benutzer wie auch das Passwort läd beim "oncreate".Durch "rewrite" kann der Benutzer nach erfolgreicher Eingabe des Passworts,des aktuellen Benutzernamens und des neuen Benutzernamens auf die Benutzerdaten-Datei "bn.cb" den neuen Benutzernamen "einschreiben"
Nun haut mir Delphi den AE-Fehler 32 um die Ohren, obwohl die Datei "bn.cb" vorher durch "closefile" dicht gemacht wurde.
Wäre toll wenn ihr mir vielleicht sagen könntet wo der Fehler ist und eine Hilfestellung gebt, wie ich das ganze beseitigen kann.
Hier nochmal der QC fürs "Ändern"
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69:
| procedure TForm5.Button1Click(Sender: TObject); begin if Edit1.Text = BN1 then if Edit2.Text = PW1 then if Edit3.Text = Edit4.Text then begin
assignFile(InFile2, 'c:\bn.cb'); rewrite(InFile2); writeln(InFile2, Edit3.Text); writeln(InFile2, BN2); writeln(InFile2, BN3); CloseFile (InFile2); Showmessage('Benutzer geändert! Starten Sie das Programme erneut!'); form1.close; form2.close; form3.close; form4.Close; end else Showmessage('Die Benutzer stimmen nicht überein') else Showmessage('Das Passwort ist nicht korrekt') else if Edit1.Text = BN2 then if Edit2.Text = PW2 then if Edit3.Text = Edit4.Text then begin assignFile(Infile2, 'c:\bn.cb'); rewrite(Infile2); writeln(InFile2, BN1); writeln(InFile2, Edit3.Text); writeln(InFile2, BN3); CloseFile (InFile2); Showmessage('Benutzer geändert! Starten Sie das Programme erneut!'); form1.close; form2.close; form3.close; form4.Close; end else Showmessage('Die Benutzer stimmen nicht überein') else Showmessage('Das Passwort ist nicht korrekt') else if Edit1.Text = BN3 then if Edit2.Text = PW3 then if Edit3.Text = Edit4.Text then begin assignFile(Infile2, 'c:\bn.cb'); rewrite(Infile2); writeln(InFile2, BN1); writeln(InFile2, BN2); writeln(InFile2, Edit3.Text); CloseFile (InFile2); Showmessage('Passwort geändert! Starten Sie das Programme erneut!'); form1.close; form2.close; form3.close; form4.Close; end else Showmessage('Die Benutzer stimmen nicht überein') else Showmessage('Das Passwort ist nicht korrekt') else Showmessage('Benutzer unbekannt!');
end; |
und hier fürs "Formcreate"
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm5.FormCreate(Sender: TObject); begin assignFile(Infile, 'c:\pw.cb'); assignFile(Infile2, 'c:\bn.cb'); reset(InFile); reset(InFile2); while not eof (InFile) do begin readln(InFile, PW1); readln(InFile, PW2); readln(InFile, PW3); end; while not eof (InFile2) do begin readln(InFile2, BN1); readln(InFile2, BN2); readln(InFile2, BN3); end; CloseFile (InFile); CloseFile (InFile2);
end; |
mfg
audi
edit: habe glo. var ersetzt
edit2: relative pfade wurden ersetzt
Moderiert von
Narses: Quote- durch Delphi-Tags ersetzt
BenBE - Do 25.03.10 19:56
Bzgl. der Fehlermeldung:
Melancholy of Haruhi-chan Suzumiya
Und zu deinem Source:
- Programm beenden mit Application.Terminate;
- Globale Variablen sind bäh!
- Hat dein Nutzer die Berechtigungen für den Zugriff auf die Datei? Schreibschutz?
- Schau Dir mal das Thema Resourcenschutzblöcke (Try...finally\try...Except) an.
ALF - Do 25.03.10 19:59
hi,
Bitte verwende kein [Zitat] für Quellcode! dafür gibts [delphi]deinquellcode[/delphi] tags.
Hast Du schon mal versucht Deinen Quellcode zu Debuggen! Also Haltepunkt setzen und dann Step by Step die Zeilen abzuarbeiten um den oder die Fehler zu Finden?
Gruss ALf
audioexe - Do 25.03.10 20:06
so wollte nich antworten bevor ich mir sicher bin, den Inhalt des Posts von BenDe vollständig (nicht) verstanden zu haben^^
erstmal, danke für die Umstellung von [Zitat] auf [Delphi].
Werde das beim nächsten Post von mir beachten.
Nun BTT
Ich bin noch nicht so lange im Bereich Delphi unterwegs, was ihr auch sicherlich durch meinen Quellcode erkennen könnt.
Bedeutet, dass es mir etwas schwer fällt durch das Try..Finally Gewühl durchzusteigen.
Ich benutze Globale Var. da ich das mal iwann von meinem Lehrer vor ein paar Jahren in der Schule mitbekommen habe und würde auch gerne bei dieser Variante bleiben wenn das iwie möglich ist.
Der Benutzer hat die Rechte für den Zugriff.
Das ganze Programm gibts auch noch fürs PW ändern und da klappts einwandfrei nur hier nicht.
Der schmeißt mir den Fehler bei "rewrite(Infile2)" raus.
edit:
(bei allen 3 "rewrite(Infile2)" in den if schleifen)
ALF - Do 25.03.10 20:24
Ich würde erst mal Prüfen ob die Datei überhaupt da ist bevor ich rewrite aufrufe!
z.B.
Delphi-Quelltext
1: 2:
| assignFile(InFile2, 'bn.cb'); if not(FileExists('bn.cb')) then ReWrite(InFile2); |
Aber dazu hat
BenBE ja schon was gesagt!
audioexe | Zitat: |
| Ich benutze Globale Var. ...... würde auch gerne bei dieser Variante bleiben |
Empfehlung auch von mir: Ganz schnell Umdenken! :wink:
Gruss ALf
audioexe - Do 25.03.10 20:39
umdenken, gerne^^
was wären denn die Alternativen zu Globalen Variablen?
ALF - Do 25.03.10 20:48
z.B.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm5.Button1Click(Sender: TObject); var InFile2 = TextFile;
begin assignFile(InFile2, 'bn.cb'); end; |
Der Rest ist ein Lernprozess, Tutorials lesen, Delphi Hilfe usw.
Gruss Alf
audioexe - Do 25.03.10 20:55
achso meintest du das, die VAR direkt in der Procedure deklarieren. Ja des is kein Thema.
aber meine Frage bleibt leider noch bestehen. Warum haut der mir da diesen Fehler raus?
Kurzes Update. Habe gelesen das man keine relativen Pfade angeben soll. Hab ich geändert, Fehler bleibt bestehen.
delphi10 - Do 25.03.10 21:00
ALF hat folgendes geschrieben : |
Ich würde erst mal Prüfen ob die Datei überhaupt da ist bevor ich rewrite aufrufe!
z.B. Delphi-Quelltext 1: 2:
| assignFile(InFile2, 'bn.cb'); if not(FileExists('bn.cb')) then ReWrite(InFile2); |
|
Und wozu soll das in diesem Fall gut sein? ReWrite überschreibt eine vorhandene Datei oder legt eine neue an. Fehler 32 heißt, dass diese Datei von einem anderen Prozess geöffnet wurde und somit nicht schreibbereit ist. Also einfach mal gucken, wer da noch seine (Prozess)Finger im Spiel hat.
Edit: Das Gemeine bei Fehlern aus dem Filesystem ist, dass sie bereits eventuell irgendwo "vorher" ausgelöst wurden und sich aber erst in so einer Situation bemerkbar machen. Ich lösche grundsätzlich den IOError-Speicher durch abfragen des selben zu begin einer Procedure, in der irgendetwas mit Dateien gemacht wird.
audioexe - Do 25.03.10 21:03
@delphi10
ja das dachte ich mir auch, dass unter Umständen da noch iwo ein "closefile" zu wenig ist.
Aber ich hab den Code wirklich ziemlich genau durchgeschaut und ich finde da nichts, was da noch stören könnte.
ALF - Do 25.03.10 21:51
delphi10 oops, da hab ich doch echt an Zeilen bearbeitung gedacht und nicht daran das er ständig eine neue Datei erstellt für sowas. :wink:
audioexe CrossPosts werden in Foren nicht gern gesehen!!
Da wir hier aber den gleichen QuellCode sehn wie in DT, dürftest Du wahrscheinlich doch nicht so genau lesen was andere schreiben, oder versuchen es umzusetzen! mh...
Gruss ALf
BenBE - Fr 26.03.10 00:34
audioexe hat folgendes geschrieben : |
| so wollte nich antworten bevor ich mir sicher bin, den Inhalt des Posts von BenDe vollständig (nicht) verstanden zu haben^^ |
Naja, vor dem Verstehen käme zuerst das Lesen - was Du scheinbar auch nicht tust, wie man wunderbar an meinem "Nick" in deinem Post sieht. Vergleich mal mit dem, was links neben diesem Post steht ;-)
Aber sei unbesorgt: Obwohl ich deinen Satz ausgiebig gelesen habe, versteh ich nicht, was Du damit ausdrücken möchtest.
Zu den Alternativen zu globalen Variablen:
- Lokale Variablen wie bereits gezeigt
- Felder\Properties im Formular-Objekt
Und SOOOO Schwierig ist Try\Finally bzw. Try\Except auch nicht zu verstehen, wenn man sich einmal die Hilfe bzw. diverse Tutorials durchliest.
@ALF: Crossposts gehen schon in Ordnung, solange sie angegeben werden (und zwar direkt im Einleitungspost). Sollte man aber vermeiden, wenn es keinen triftigen Grund für gibt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!