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

Fab*_*ale 3 delphi

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

代替这个:

if FileExists(MyFile) then begin
        if not DeleteFile(MyFile) then
                ShowMessage('Unable to delete file');
end;
Run Code Online (Sandbox Code Playgroud)

写这个:

if not DeleteFile(MyFile) then
        ShowMessage('Unable to delete file');
Run Code Online (Sandbox Code Playgroud)

他的优点和缺点是什么?

Dav*_*nan 8

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


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

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

以跨平台的方式做到这一点并不容易,而且我不认为RTL提供这种功能。


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


Arn*_*hez 5

打电话FileExists()是没有意义的。

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

因此,首选第二版:

if not DeleteFile(MyFile) then
    ShowMessage('Unable to delete file');
Run Code Online (Sandbox Code Playgroud)

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