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 user profile iconNarses: 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 user profile iconBenBE ja schon was gesagt!

user profile iconaudioexe
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.


Xentar - Do 25.03.10 21:00

Crosspost...
http://forum.delphi-treff.de/showthread.php?t=28654


delphi10 - Do 25.03.10 21:00

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
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

user profile icondelphi10 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:

user profile iconaudioexe 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

user profile iconaudioexe hat folgendes geschrieben Zum zitierten Posting springen:
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.

Vom Meister persönlich [http://www.delphi-forum.de/viewtopic.php?p=474452#474452]:
Psssst: Crashkurs [http://www.christian-stelzmann.de/index_tutorials_crashkurs.html], Crashkurs Reloaded [http://www.christian-stelzmann.de/index_tutorials_crashkurs_reloaded.html]


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