【发布时间】:2017-10-21 02:20:33
【问题描述】:
我正在编写的一个工具负责在几个小时内下载数千个图像文件。最初,使用TIdHTTP,我会将Get 文件放入TMemoryStream,然后将其保存到文件中,只要没有例外。为了提高速度,我把TMemoryStream改成了TFileStream。
但是,现在如果找不到资源,或者任何导致没有实际文件的异常,它仍然会保存一个空文件。
完全可以理解,因为我只是在下载之前创建了一个文件流...
FileStream:= TFileStream.Create(FileName, fmCreate);
try
Web.Get(AURL, FileStream);
finally
FileStream.Free;
end;
我知道如果出现异常,我可以简单地删除文件。但这似乎太草率了。我确信有一种更合适的方法可以终止这种情况。
如果出现异常,我应该如何使它不保存文件,同时不改变性能(如果可能的话)?
【问题讨论】:
-
您可以在
TFileStream上编写自己的包装器,这将延迟创建文件,直到有一些数据要写入它为止。 -
我将创建自己的文件流类,该类将使用
FILE_SHARE_DELETE共享模式调用CreateFile,当引发Indy 异常时,我将调用DeleteFile函数(例如,来自该类的方法) 将文件标记为删除,并在文件的最后一个句柄关闭时将其删除(即释放流的时间)。 -
我将创建一个带有布尔成员的
TFileStream后代,并仅在下载成功时设置该成员,如果未设置布尔值,则让析构函数删除文件。 -
我知道如果出现异常我可以简单地删除该文件。但这似乎太草率了。 一点也不草率。实际上,这就是异常处理的要点:它是回滚状态的钩子,该状态先前已更改,但由于异常而不再适用。 (人们可能会争论一般异常处理的草率;但这会导致关于无状态和函数式编程的讨论。)
标签: performance delphi indy tfilestream