【发布时间】:2013-05-04 14:04:55
【问题描述】:
我正在使用 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;
您的专家对使用一种或其他类型(内存流或文件流)有何看法?使用一种或其他类型时,EXE 文件的结构有什么不同吗?推荐什么类型?
谢谢!周末愉快!
【问题讨论】:
-
TMemoryStream在内部使用TFileStream保存到文件(对于SaveToFile方法),所以答案很简单——使用TFileStream。 -
我可以考虑使用 TMemoryStream 而不是 TFileStream 的两个原因。避免在发生异常的情况下清理文件系统,并且在将其保存到文件之前需要进行一些操作。
-
你对
with的肆意使用让我害怕。我建议你停止这样做。 -
@bummi,我正在创建一个从我的站点下载应用程序文件的安装程序,我认为您使用 memorystream 是正确的,因为连接可能会失败并产生异常。
-
@bummi,我想说这些方法有缺点,一方面是临时文件混乱,另一方面是内存占用。
标签: delphi filestream indy memorystream idhttp