Entwickler-Ecke
Dateizugriff - I/O Error 32
mtm - Fr 04.06.10 11:30
Titel: I/O Error 32
Hallo zusammen.
Ich habe ein kleines MDI-Interface geschrieben, mit dem Textdateien bearbeitet werden sollen (nur so zu Testzwecken). Funzt auch soweit ohne Probleme.
Ich habe das Programm aber auch auf meinem Notebook installiert (um den Umgang mit Installshield auszuprobieren), auf dem Delphi selbst nicht installiert war. Wenn ich dort nun eine vorhandene Datei bearbeitet habe und sie speichern wollte trat der Fehler
I/O Error 32
auf. Ansonsten funktioniert das Programm einwandfrei. Speichere ich die Datei unter einem anderen Namen, gibt es kein Problem. Nachdem ich auf dem Notebook ebenfalls Delphi installiert habe, tritt dieser Fehler nicht mehr auf.
Vielleicht hatte ja jemand von Euch schon mal ein ähnliches Problem. Für Lösungsansätze wäre ich extrem dankbar.
Danke im Voraus
mtm
delphi10 - Fr 04.06.10 12:21
I/O-Error 32 = Datei ist belegt. Dateiname ist möglicherweise bereits vorhanden und geöffnet.
cu delphi10
jaenicke - Fr 04.06.10 12:43
Dementsprechend:
--> Vermutlich ist die Daten noch vom Öffnen offen und soll ein zweites Mal zum Speichern geöffnet werden.
Ohne Quelltext lässt sich dazu aber nicht mehr sagen. :nixweiss:
Delete - Fr 04.06.10 12:48
Meine Glaskugel sagt mir, dass du die Dateivariable unnötigerweise global deklariert hast. Und jetzt bist du beim Öffnen und Schlissen durcheinander gekommen. Deklarier die Dateivariable lokal und öffne und schließe die Datei in der Routine, in der auch in die Datei geschrieben oder gelesen wird. Damit kannst du solche Fehler vermeiden.
Oder aber die Datei ist noch von einem anderen Programm exklusiv geöffnet. Aber da kann man nur raten, da du mit Informationen sehr sparsam bist.
mtm - Fr 04.06.10 14:45
Danke schon mal für Eure Antworten.
Hier sind mal die Codeschnipsel für's Öffnen und Speichern der Dateien
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:
| procedure TfrmEdit.OpenFile(fn:String); var tf:TextFile; txt:String; sl:TStringList; r:Integer; begin AktFile := fn; grd.RowCount := 0; AssignFile(tf,fn); reset(tf); while not eof(tf) do begin readln(tf,txt); if lowercase(copy(txt,1,4))<>'head' then begin sl := Split(txt,'|'); grd.AddRow(1); r := grd.LastAddedRow; grd.Cells[0,r] := sl.Strings[0]; grd.Cell[1,r].AsInteger := StrToInt(sl.Strings[1]); grd.cells[2,r] := sl.Strings[2]; grd.cells[3,r] := EffStr.Strings[StrToInt(sl.Strings[3])]; end; end; CloseFile(tf); saved := true; grd.BestFitColumns(bfBoth); end; |
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:
| procedure TfrmEdit.SaveData(fn:String); var tf:TextFile; i,a:Integer; txt:String; ts:TStringList; begin AssignFile(tf,fn); Rewrite(tf); for i:=0 to grd.RowCount-1 do begin ts := TStringList.Create; ts.Add(grd.Cells[0,i]); ts.Add(grd.cells[1,i]); ts.Add(grd.Cells[2,i]); a := EffStr.IndexOf(grd.Cells[3,i]); ts.Add(IntToStr(a)); txt := Join(ts,'|'); writeln (tf,txt); end; CloseFile(tf); saved := true; AktFile := fn; end; |
Woanders werden die Dateien nicht angepackt. Ich glaube auch nicht wirklich, daß es daran liegen könnte, daß die Datei noch von einem anderen Prozess geöffnet ist, da ja dann dieser Fehler auch auftreten müsste, wenn ich das Programm auf dem Notebook starte, nachdem ich Delphi installiert habe.
Ich bin also immer noch ziemlich ratlos. :?!?:
jaenicke - Fr 04.06.10 14:55
Da sehe ich auf Anhieb jetzt auch kein Problem (es sei denn da kann eine Exception auftreten, die du irgendwo mit try..except unterdrückst). Hast du einmal mit dem Process Explorer nach offenen Handles auf die Datei gesucht?
Narses - Fr 04.06.10 14:57
Moin!
jaenicke hat folgendes geschrieben : |
Da sehe ich auf Anhieb jetzt auch kein Problem |
Bis auf das Memory-Leak, weil die Stringlisten nicht freigegeben werden. ;)
cu
Narses
jaenicke - Fr 04.06.10 16:03
Stimmt, darauf habe ich gar nicht geachtet, ich war nur auf die Freigabe des Dateihandles usw. fixiert.
mtm - Fr 04.06.10 16:49
Tja, scheinbar war das mit den nicht freigegebenen Stringlisten die Lösung.
Ich kapiere zwar nicht, wieso dieser spezielle Fehler auftrat, aber jetzt funktioniert's auf jeden Fall.
Danke Euch
mtm
jaenicke - Fr 04.06.10 16:58
Das hört sich danach an als hättest du eher Probleme mit überschriebenem Speicher. Denn daraus resultieren dann solche eigentlich nicht erklärbaren Probleme. Schließlich hat die Nicht-Freigabe von Speicher erst einmal nix mit der Datei zu tun.
Du kannst die Bereichsüberprüfung in den Projektoptionen unter Compiler anschalten und ReportMemoryLeaksOnShutdown in der Projektdatei auf True setzen. Vielleicht bekommst du dann Anzeigen.
Delete - Fr 04.06.10 18:45
jaenicke hat folgendes geschrieben : |
Schließlich hat die Nicht-Freigabe von Speicher erst einmal nix mit der Datei zu tun. |
Nicht unbedingt. Dateistreams werden erst freigegeben bzw. geschlossen, wenn das Streamobjekt freigegeben wird.
jaenicke - Fr 04.06.10 18:56
Das ist schon klar, aber die TStringList wird ja eben nicht zum Lesen / Schreiben der Datei benutzt. Es werden darin nur die Strings für die Zeilen verwaltet, der Zugriff an sich passiert mit ReadLn und WriteLn. ;-)
// EDIT:
Nebenbei ist Split und Join hier vollkommen überflüssig. Das kann die TStringList mit Delimiter und DelimitedText schon selbst...
// EDIT2 (@Antwort):
Na dann ist ja klar, dass uns klar ist, dass alles klar ist. :mrgreen:
Delete - Fr 04.06.10 18:58
Ich wollte nur deine Aussage etwas korrigieren. Dass dies bei ihm nicht zutrifft, ist klar.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!