Delphi - MemoryStream或FileStream

Guy*_*ush 7 delphi memorystream indy filestream idhttp

我正在使用Indy(idHTTP)从Internet下载EXE文件,我可以使用memorystream或filestream将其保存到磁盘,但我真的不知道它们之间是否有任何区别(可能在文件的结果结构中? ).我找不到答案.

这里有两个简单的函数来模拟我在做什么:

Function DownloadMS(FUrl, Dest: String): Boolean;
var
  Http: TIdHTTP;
  Strm: TMemoryStream;
Begin
  Result := False;
  Http := TIdHTTP.Create;
  Strm := TMemoryStream.Create;
  With Http, Strm Do
  Try
    Try
      Get(FUrl, Strm);
      If (Size > 0) Then
      Begin
        Position := 0;
        SaveToFile(Dest);
        Result := True;
      end;
    Except
    end;
  Finally
    Strm.Free;
    Http.Free;
  end;
end;

Function DownloadFS(FUrl, Dest: String): Boolean;
var
  Http: TIdHTTP;
  Strm: TFileStream;
Begin
  Result := False;
  Http := TIdHTTP.Create;
  Strm := TFileStream.Create(Dest, fmCreate);
  With Http, Strm Do
  Try
    Try
      Get(FUrl, Strm);
      Result := (Size > 0);
    Except
    end;
  Finally
    Strm.Free;
    Http.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

您的专家考虑使用一种或其他类型(内存流或文件流)?使用一种或其他类型时,EXE文件的结构有什么不同吗?推荐什么类型?

谢谢!周末愉快!

Sir*_*ufo 7

之间不存在差异TMemoryStreamTFileStream从视点流.

它们都是流并保存一个字节流,并且都是从中派生出来的TStream.

您可以像这样实现广义的功能

function DownloadToStream( const AUrl : String; ADest : TStream ): Boolean;
var
  LHttp: TIdHTTP;
begin
  LHttp := TIdHTTP.Create;
  try
    LHttp.Get( AUrl, ADest );
    Result := ADest.Size > 0;
  finally
    LHttp.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

并用它来调用它 TFileStream

var
  LStream : TStream;

begin
  LStream := TFileStream.Create( 'MyFile.exe', fmCreate );
  if DownloadToStream( '', LStream ) then
    ...
end;
Run Code Online (Sandbox Code Playgroud)

或者TMemoryStream您喜欢的任何流实例