Autor |
Beitrag |
mtm
      
Beiträge: 64
Windows 10 Pro 64 Bit
Delphi XE 6
|
Verfasst: Fr 04.06.10 11:30
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
      
Beiträge: 447
Erhaltene Danke: 2
W2K, XP, Vista64, Win7 64
RAD-Studio 2010
|
Verfasst: Fr 04.06.10 12:21
I/O-Error 32 = Datei ist belegt. Dateiname ist möglicherweise bereits vorhanden und geöffnet.
cu delphi10
_________________ Salus populi suprema lex esto
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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 
      
Beiträge: 64
Windows 10 Pro 64 Bit
Delphi XE 6
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 04.06.10 16:03
Stimmt, darauf habe ich gar nicht geachtet, ich war nur auf die Freigabe des Dateihandles usw. fixiert.
Für diesen Beitrag haben gedankt: InfocrackUrsula
|
|
mtm 
      
Beiträge: 64
Windows 10 Pro 64 Bit
Delphi XE 6
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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. 
Zuletzt bearbeitet von jaenicke am Fr 04.06.10 19:01, insgesamt 1-mal bearbeitet
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 04.06.10 18:58
Ich wollte nur deine Aussage etwas korrigieren. Dass dies bei ihm nicht zutrifft, ist klar.
|
|