通过文件流取消保存文件的适当方法?

时间:2017-10-21 02:20:33

标签: performance delphi indy tfilestream

我正在编写的工具负责在几个小时内下载数千个图像文件。最初,使用TIdHTTP,我将Get文件放入TMemoryStream,然后将其保存到文件中,只要没有例外。为了提高速度,我将TMemoryStream更改为TFileStream

但是,现在如果找不到资源,或者导致没有实际文件的任何异常,它仍会保存一个空文件。

完全可以理解,因为我只是在下载之前创建一个文件流...

FileStream:= TFileStream.Create(FileName, fmCreate);
try
  Web.Get(AURL, FileStream);
finally
  FileStream.Free;
end;

我知道如果有异常,我可以删除该文件。但它似乎太草率了。我确信有一种更合适的方法可以中止这种情况。

如果有异常,我应该怎么做才能保存文件,而不改变性能(如果可能的话)?

2 个答案:

答案 0 :(得分:11)

  

如果有异常,我应该怎么做才能保存文件,而不改变性能(如果可能的话)?

一般来说,这是不可能的。错误和失败可能发生在任何步骤,如果方式,包括通过下载的部分方式。理解了这一点后,您必须接受该文件可以部分下载然后放弃。那你在哪里储存它?

显而易见的选择是内存和文件。你不想存储到存储器,它留给文件。

这将带您回到当前的解决方案。

  

我知道如果有异常我只能删除该文件。

这是正确的方法。这有几个变种。例如,您可能会下载到使用标志创建的临时文件,以便在关闭时排列其删除。只有下载完成后才能复制到真正的目的地。这是浏览器采用的方法。但基本的想法是下载到文件并通过整理来处理任何失败。

答案 1 :(得分:0)

如果服务器支持HTTP范围请求,您可以考虑使用HTTP范围请求,而不是一次性下载整个映像。然后,您可以将文件分块为较小的部分,在第一次完成后请求下一部分(或者甚至同时请求多个部分以提高性能)。如果存在异常,那么您可以了解未来的请求,因此它们永远不会从头开始。

YouTube和许多流媒体网站刚刚开始这样做。过去,如果你开始播放视频,然后暂停它,那么它最终会缓存整个视频。现在它只缓存当前位置的一点点。由于视频放弃率,这可以节省大量带宽。

您可以将部分文件写入磁盘或将其保留在内存中。