前一段时间,我不记得我在哪里听说过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');
第二个优点和缺点是什么?
答案 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调用。