Raf*_*cci 4 delphi file indy download delphi-2010
考虑使用Indy组件从Internet下载文件的以下代码:
procedure TForm26.Button1Click(Sender: TObject);
var
vFileStream : TStream;
begin
DeleteFile('C:\test.exe');
vFileStream := TFileStream.Create('C:\test.exe', fmCreate);
IdHTTP1.Get('SomeUrl', vFileStream);
vFileStream.Free;
end;
Run Code Online (Sandbox Code Playgroud)
我得到一个Out of memory异常.发生的事情是,除了我正在使用的事实之外TFileStream,写入它的字节不会直接进入磁盘,相反,它们会一直停留在内存中直到get终止.
我试图下载的文件非常非常大.
有没有人知道如何下载一个大文件而不会出现内存不足的异常?
Delphi 2010和来自Indy SVN的最新Indy 10.
编辑
那不是FileStream问题.这是一个Indy问题.不知何故,Indy在写入流之前将文件缓存在内存中.
TIdHTTP如果数据被压缩,或者数据是HTML并且TIdHTTP.HTTPOptions属性不包含hoNoParseMetaHTTPEquiv标志,则将整个文件下载到内存中.
Indy还不支持HTTP的流式解压缩(虽然它适用于FTP),因此TIdHTTP将整个压缩数据缓存到内存中,然后再将其解压缩到文件中.
解析HTML有时需要在将HTML经由HTML覆盖HTTP标头值与新的值的情况下<meta>的标签,最重要的是数据的字符集的值,因此TIdHTTP使用正确的字符集时,数据被返回到用户的代码作为可以解码数据String.启用该hoNoParseMetaHTTPEquiv标志会禁用该解析,从而禁用HTML数据的任何缓存(除非也使用压缩).