| Autor | Beitrag | 
| mtm 
          Beiträge: 64
 
 Windows 10 Pro 64 Bit
 Delphi XE 6
 
 | 
Verfasst: Fr 04.06.10 10: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 11: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 04.06.10 11: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 11: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 13: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 04.06.10 13: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 13: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 04.06.10 15: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 15: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 04.06.10 15: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 17: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: 19326
 Erhaltene Danke: 1749
 
 W11 x64 (Chrome, Edge)
 Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
 
 | 
Verfasst: Fr 04.06.10 17: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 18:01, insgesamt 1-mal bearbeitet
 | 
|  | 
| Luckie Ehemaliges Mitglied
 Erhaltene Danke: 1
 
 
 
 
 | 
Verfasst: Fr 04.06.10 17:58 
 
Ich wollte nur deine Aussage etwas korrigieren. Dass dies bei ihm nicht zutrifft, ist klar. | 
|  |