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

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

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

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

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

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


Delete - Mo 06.10.08 09:57

Falls es interessiert, ihr könnt aufhören rum zu raten. Das ist ein Crossposting. Eine Lösung wurde wahrscheinlich hier gefunden: http://www.delphipraxis.net/topic143739_tfilestream+datei+bereits+in+benutzung.html


jaenicke - Di 07.10.08 21:36

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