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