AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TFileStream.Free gibt Datei nicht frei?

Ein Thema von DGL-luke · begonnen am 8. Mai 2006 · letzter Beitrag vom 9. Mai 2006
Antwort Antwort
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

TFileStream.Free gibt Datei nicht frei?

  Alt 8. Mai 2006, 17:00
Hallo,

ich habe einen mit TFileStream.Create('filename',fmCreate) erzeugten Filestream. Diesen bekommt ein TIdHTTP(.Get) und lädt auch was schönes runter.
Ich gebe den Stream im OnWorkEnd wieder frei, dabei wird allerdings das Dateihandle nicht freigegeben. Ich kann also auf die erzeugte Datei nicht zugreifen solange meine Anwendung läuft.
Ich hab mir dann gedacht, dass vielleicht Indy den stream "behält" und mir selber eine Message gepostet, in der dann steht, dass ich Indy freigeb. Aber das hilft auch nichts.

Der relevante Code:

Delphi-Quellcode:
procedure TFIndyLoader.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
var http: TIdHTTP;
begin
  Beep;

  http := Sender as TIdHTTP;

  FreeAndNil(downloads[http.Tag].res.fs); // fs = der filestream

  Postmessage(Handle,WM_FREE,Integer(@http),0); //WM_FREE = WM_USER + 1
end;

procedure TFIndyLoader.OnWMFREE(var Msg: TWMFree);
begin
  windows.Beep(440,500);

  if Assigned(TObject(Msg.wParam)) then
    with TObject(Msg.wParam) as TIdHTTP do
      begin
        Response.ContentStream.Free; //mal so auf gut glück...
        Free;
      end;
end;
Beide Beeps kommen an, die Prozeduren werden also durchgeführt.

Interessanterweise habe ich das selbe Problem bei meinem JPEG-Kompressor, habe es da aber auf die Konvertierungsorgien zurückgeführt...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: TFileStream.Free gibt Datei nicht frei?

  Alt 9. Mai 2006, 13:14
Ich habe das ganze jetzt so "gelöst":

Delphi-Quellcode:
//....
curr.http.Get(curr.url,TMemoryStream.Create); //curr.http is TIdHTTP
//....

procedure TFIndyLoader.IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
var http: TIdHTTP;
    dir: string;
begin
  Beep;

  dir := IncludeTrailingPathDelimiter(ELocalDir.Text);
  ForceDirectories(dir);

  http := Sender as TIdHTTP;

  http.Response.ContentStream.Position := 0;

  with TFileStream.Create(dir + downloads[http.Tag].fname,fmCreate) do
    try
      CopyFrom(http.Response.ContentStream,http.Response.ContentStream.Size);
    finally
      Free;
    end;

  Postmessage(Handle,WM_FREE,Integer(@http),0);
end;
Is aber eher ein workaround...
Was mich noch wundert: wenn ich im OnWorkEnd gleich Response.ContentStream freigegeben habe, hat er zwar ein paar AVs geworfen, aber die Datei war danach frei...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz