在DeleteFile()之前必须检查FileExists()吗?

时间:2019-05-29 07:04:48

标签: delphi

前一段时间,我不记得我在哪里听说过delphi的最佳实践。

代替此:

if FileExists(MyFile) then begin
        if not DeleteFile(MyFile) then
                ShowMessage('Unable to delete file');
end;

这样写:

if not DeleteFile(MyFile) then
        ShowMessage('Unable to delete file');

第二个优点和缺点是什么?

2 个答案:

答案 0 :(得分:7)

为清楚起见,我阅读您问题中的代码是为了删除文件,并仅在文件存在且无法删除时报告错误。


最好不要尝试在尝试删除文件之前检查文件是否存在。实际上,这样做是一种经典的反模式。

正确的模式是尝试直接删除文件。如果失败,请检查失败原因。这将告诉您该文件是否存在,或由于其他原因删除失败。在Windows上,这意味着使用名为DeleteFile的Win32 API函数并检查其返回值是否成功。如果发生故障,请致电GetLastError以获得故障原因。

以跨平台的方式进行操作并不是一件容易的事,而且我认为RTL不提供这种功能。


值得指出的是,您的两个代码块不可互换。他们有不同的行为。第一个块将不存在的文件视为成功。第二个将其视为错误。如果只希望通过单个函数调用来重现第一个行为,则如上所述,您需要根据错误代码进行区分。

答案 1 :(得分:4)

呼叫FileExists()是毫无意义的。

该文件可能存在,但不能删除-例如如果它是只读的,或者被另一个进程锁定。不会比调用DeleteFile()更快。

因此首选第二版:

if not DeleteFile(MyFile) then
    ShowMessage('Unable to delete file');

注意:SysUtils.pas中的DeleteFile()是跨平台的,并且返回一个布尔值以获取成功-因为注释和某些答案仅处理来自Windows.pas的原始API调用。