Delphi-MemoryStream или FileStream

я загружаю EXE-файл из интернета с помощью Indy (idHTTP), и я могу использовать memorystream или filestream, чтобы сохранить его на диск, но я действительно не знаю, есть ли разница между ними (возможно, в структуре результата файла?). Я не мог найти ответа на этот вопрос.

где, вот 2 простые функции для имитации того, что я делаю:

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;

что вы думаете об использовании того или иного типа (memorystream или filestream)? Есть ли разница в структуре EXE-файла при использовании того или иного типа? Какой тип рекомендуется?

спасибо! Хороших выходных!

2 ответов


нет никакой разницы между TMemoryStream или TFileStream С точки зрения потока.

они оба потока и содержат поток байтов и оба являются производными от 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;

и вызовите его с TFileStream

var
  LStream : TStream;

begin
  LStream := TFileStream.Create( 'MyFile.exe', fmCreate );
  if DownloadToStream( '', LStream ) then
    ...
end;

или TMemoryStream или любой экземпляр потока, который вам нравится


во многих случаях нет смысла помещать промежуточный поток памяти между загрузкой и файлом. Все, что будет делать, это потреблять память, потому что вы должны поместить весь файл в память, прежде чем вы можете поместить его на диск. Использование потока файлов напрямую позволяет избежать этой проблемы.

основные ситуации, когда файл потока проблем, если вы хотите быть уверены, что вы успешно скачали весь файл перед сохранением на диск. Например, если вы перезапись предыдущей версии файла, вы можете загрузить его, проверить хэш-подпись, и только затем перезаписать исходный файл. В этом случае вам нужно поместить файл в какое-то временное расположение перед перезаписью. Можно использовать поток памяти или поток файлов с временным именем файла.