gpt4 book ai didi

delphi - 文件存在和修改日期的问题

转载 作者:行者123 更新时间:2023-12-03 14:38:35 27 4
gpt4 key购买 nike

我的服务器上有一些修改日期为 1979 年 12 月 31 日的文件(不要问我为什么)。所以 FileExists 返回 false。

Sysutils.FileExists 看起来像这样:

function FileAge(const FileName: string): Integer;
var
Handle: THandle;
FindData: TWin32FindData;
LocalFileTime: TFileTime;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
if Handle <> INVALID_HANDLE_VALUE then
begin
Windows.FindClose(Handle);
if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
begin
FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
LongRec(Result).Lo) then Exit;
end;
end;
Result := -1;
end;

function FileExists(const FileName: string): Boolean;
begin
Result := FileAge(FileName) <> -1;
end;

我的问题是,为什么该函数首先依赖于 FileAge ?下面这行还不够吗?:

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

甚至基于文件属性:

function MyFileExists(const Name: string): Boolean;
var
R: DWORD;
begin
R := GetFileAttributes(PChar(Name));
Result := (R <> DWORD(-1)) and ((R and FILE_ATTRIBUTE_DIRECTORY) = 0);
end;

最佳答案

现代版本的 Delphi 实现 FileExists 的方式与您的代码大致相同。该实现对符号链接(symbolic link)进行了额外的处理,但在其他方面与您的版本基本相同。

现代 Delphi 实现中有一个有趣的细微差别。如果对 GetFileAttributes 的调用返回 INVALID_FILE_ATTRIBUTES,则代码不会立即退出。相反,它这样做:

LastError := GetLastError;
Result := (LastError <> ERROR_FILE_NOT_FOUND) and
(LastError <> ERROR_PATH_NOT_FOUND) and
(LastError <> ERROR_INVALID_NAME) and ExistsLockedOrShared(Filename);

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

很难说为什么代码是旧版本中的样子。我认为它很弱。就我个人而言,我会使用代码 Hook 将 FileExists 替换为更好的版本。例如:Patch routine call in delphi

一如既往,有一个 Raymond Chen有关该主题的文章:Superstition: Why is GetFileAttributes the way old-timers test file existence?

关于delphi - 文件存在和修改日期的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13959187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com