delphi – 与FileExists和修改日期的问题

前端之家收集整理的这篇文章主要介绍了delphi – 与FileExists和修改日期的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的服务器上有一些文件修改日期31 / DEC / 1979(不要问我为什么).所以FileExists返回false.

Sysutils.FileExists看起来像这样:

  1. function FileAge(const FileName: string): Integer;
  2. var
  3. Handle: THandle;
  4. FindData: TWin32FindData;
  5. LocalFileTime: TFileTime;
  6. begin
  7. Handle := FindFirstFile(PChar(FileName),FindData);
  8. if Handle <> INVALID_HANDLE_VALUE then
  9. begin
  10. Windows.FindClose(Handle);
  11. if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
  12. begin
  13. FileTimeToLocalFileTime(FindData.ftLastWriteTime,LocalFileTime);
  14. if FileTimeToDosDateTime(LocalFileTime,LongRec(Result).Hi,LongRec(Result).Lo) then Exit;
  15. end;
  16. end;
  17. Result := -1;
  18. end;
  19.  
  20. function FileExists(const FileName: string): Boolean;
  21. begin
  22. Result := FileAge(FileName) <> -1;
  23. end;

我的问题是,为什么这个功能首先依赖于FileAge?
以下行不足够吗?

  1. if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
  2. // Yes the file exists!

甚至基于文件属性

  1. function MyFileExists(const Name: string): Boolean;
  2. var
  3. R: DWORD;
  4. begin
  5. R := GetFileAttributes(PChar(Name));
  6. Result := (R <> DWORD(-1)) and ((R and FILE_ATTRIBUTE_DIRECTORY) = 0);
  7. end;

解决方法

Delphi的现代版本与您的代码完全相同,实现了FileExists.该实现对符号链接具有额外的处理,但与其版本基本相同.

现代德尔福实现有一个有趣的细微差别.如果对GetFileAttributes的调用返回INVALID_FILE_ATTRIBUTES,则代码不会立即保释.而是这样做:

  1. LastError := GetLastError;
  2. Result := (LastError <> ERROR_FILE_NOT_FOUND) and
  3. (LastError <> ERROR_PATH_NOT_FOUND) and
  4. (LastError <> ERROR_INVALID_NAME) and ExistsLockedOrShared(Filename);

ExistsLockedOrShared的实现使用FindFirstFile和对dwFileAttributes的FILE_ATTRIBUTE_DIRECTORY的检查.这表示GetFileAttributes在文件存在但被锁定时可能会失败.但是FindFirstFile可以在这种情况下成功.这是合理的,因为FindFirstFile使用文件元数据而不是文件中存储的数据.

很难说为什么代码是旧版本的方式.我觉得它很弱.我个人使用代码钩替换FileExists更好的版本.例如:Patch routine call in delphi

一如以往,有一篇关于这个问题的Raymond Chen文章Superstition: Why is GetFileAttributes the way old-timers test file existence?

猜你在找的Delphi相关文章