Entwickler-Ecke
Internet / Netzwerk - TFilestream -> Datei wird nicht wieder frei gegeben
Serpentine - So 05.10.08 18:15
Titel: TFilestream -> Datei wird nicht wieder frei gegeben
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.Button1Click(Sender: TObject); var FS:Tfilestream; URL:String; begin URL:= 'http://.../server_'+listbox3.items.strings[ListBox3.ItemIndex]; FS:=Tfilestream.Create('SpammerList.dat',fmOpenWrite,fmShareDenyNone); IdHTTP1.Get(URL,FS); FreeAndNil(FS); IdHTTP1.Free; end; |
Wenn ich einmal auf den Button klicke funktioniert die Prozedur noch, führe ich die Prozedur nochmal durch, dann kann die Datei nicht benutzt werden, weil sie von einem anderen Prozess benutzt würde, obwohl ich sie eig wieder frei gegeben haben müsste.
Kann mir jemand helfen?
jaenicke - So 05.10.08 18:26
Das kann ich nicht reproduzieren, das einzige, was mir bei deinem Quelltext auffällt, ist, dass du einen schwerwiegenden Fehler gemacht hast. Du hast kein Verzeichnis angegeben, also typischerweise das Anwendungsdatenverzeichnis, wenn du Daten speichern willst, oder das Temp-Verzeichnis für temporäre Dateien, oder zum Testen das deiner Anwendung ( ExtractFilePath(ParamStr(0)) ).
So ist es einfach nur Glück, dass es überhaupt funktioniert.
Was die Sperrung der Datei angeht, so kann ich das nicht reproduzieren. Kann es sein, dass beim Download in Get ein Fehler auftritt und deshalb das FreeAndNil nicht abgearbeitet wird?
Serpentine - So 05.10.08 18:34
Nope, die Prozedur läuft einmal komplett durch, und dann nie wieder.
Ach und wenn man kein Verzeichnis angibt wird die Datei üblicherweise ja im "Scriptverzeichnis" abgespeichert, daher würde ich es nicht als besonders schweren Fehler bezeichnen.
Trotzdem danke für deine Bemühung
LexXis - So 05.10.08 18:37
Du gibst IdHTTP1 am Ende frei, erstellst es beim 2. Durchlauf aber nichtmehr neu!
Hat IMHO mit dem FileStream nix zu tun
mfg
Dunkel - So 05.10.08 18:38
Serpentine hat folgendes geschrieben : |
| Ach und wenn man kein Verzeichnis angibt wird die Datei üblicherweise ja im "Scriptverzeichnis" abgespeichert, daher würde ich es nicht als besonders schweren Fehler bezeichnen. |
False! (was Du auch immer als "Skriptverzeichnis" bezeichnest)
Ohne Angabe eines Pfads wird das aktuelle Arbeitsverzeichnis benutzt; üblicher Weise ist es das, wo sich auch die Echse befindet. Das kann sich aber im Programmverlauf beliebig ändern! Du weißt dann nie, wo solche Dateizugriffe landen!
Yogu - So 05.10.08 18:38
Serpentine hat folgendes geschrieben : |
| Ach und wenn man kein Verzeichnis angibt wird die Datei üblicherweise ja im "Scriptverzeichnis" abgespeichert |
Was ist denn das "Scriptverzeichnis"? Wenn kein Pfad angegeben wurde, wird der aktuelle Ordner verwendet, der
vielleicht der Ordner ist, in der die Anwendung liegt. Das ist aber nicht immer so, und kann in den Eigenschaften unter "Ausführen in" geändert werden.
LexXis hat folgendes geschrieben : |
| Du gibst IdHTTP1 am Ende frei, erstellst es beim 2. Durchlauf aber nichtmehr neu! |
Nicht schon verraten, das wird der nächste Fehler sein, wenn der erste gefixt ist. :mrgreen:
jaenicke - So 05.10.08 18:39
Serpentine hat folgendes geschrieben : |
| Ach und wenn man kein Verzeichnis angibt wird die Datei üblicherweise ja im "Scriptverzeichnis" abgespeichert |
Nein
Die Datei wird im aktuellen Arbeitsverzeichnis gespeichert! Dieses wird zum Beispiel durch Dateidialoge geändert, auch kann man es in einer Verknüpfung angeben, etc.
Ohne Verzeichnisangabe
kannst du nicht sicher sein wo die Datei gespeichert wird.
LexXis hat folgendes geschrieben : |
Du gibst IdHTTP1 am Ende frei, erstellst es beim 2. Durchlauf aber nichtmehr neu!
Hat IMHO mit dem FileStream nix zu tun |
Das habe ich ganz übersehen, weil ich es routineweise manuell erstellt habe :oops:
jaenicke - Di 07.10.08 21:36
Serpentine hat folgendes geschrieben : |
| Ach und wenn man kein Verzeichnis angibt wird die Datei üblicherweise ja im "Scriptverzeichnis" abgespeichert |
Dazu auch noch die ausführliche Erklärung mit Gegenbeispiel, das hatte ich ganz vergessen dazuzuschreiben ;-).
http://www.delphi-library.de/viewtopic.php?p=499701
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!