Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TFileStream.Free gibt Datei nicht frei? (https://www.delphipraxis.net/68955-tfilestream-free-gibt-datei-nicht-frei.html)

DGL-luke 8. Mai 2006 17:00


TFileStream.Free gibt Datei nicht frei?
 
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...

DGL-luke 9. Mai 2006 13:14

Re: TFileStream.Free gibt Datei nicht frei?
 
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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:24 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