gpt4 book ai didi

delphi - FileExists 返回 true 但文件不存在

转载 作者:行者123 更新时间:2023-12-03 15:40:53 28 4
gpt4 key购买 nike

我用 Delphi 7 编写程序。我只需要它能够处理非 Unicode 文件名。如果它找到一个 Unicode 文件名,它应该忽略它。

我的代码如下所示:

var Filename: String;

if not FileExists(Filename) then Exit;

F := TFileStream(Filename, fmOpenRead or fmShareDenyWrite);

但是,对于某些 Unicode 文件名,FileExists() 返回 true,但随后 TFileStream 会引发异常,因为路径无效。

例如:名为“loop轮纹.jpg”的文件被读入Filename为“loop??.jpg”。这是预期的行为。 TFileStream 无法读取此类文件(因为目录中没有“loop ??.jpg”)并引发异常。但 FileExists() 应该发现该文件不存在。为什么它不起作用?因为它的定义是:

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

FileAge() 定义为:

function FileAge(const FileName: string): Integer;
var
Handle: THandle;
FindData: TWin32FindData;
LocalFileTime: TFileTime;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
...

FindFirstFile 使用“loop ??.jpg”作为掩码,然后查找“loop 轮纹.jpg”。

所以问题是:

1) 我可以在 Delphi 7 中以某种方式轻松地在 TFileStream 中使用 Unicode 文件名吗?

2) 我应该使用什么函数代替 FileExists 才能获得正确的结果?

最佳答案

  1. TFileStream 本身不行,不行。但您可以使用 Win32 CreateFileW()打开 Unicode 文件名,然后将返回的 HANDLE 分配给 THandleStream 。这本质上就是 TFileStream 内部所做的事情(在 Delphi 7 中使用 CreateFileA() 代替)。

  2. Delphi 的更高版本使用 Win32 GetFileAttributes() 1 而不是 RTL 的 FileAge() 在其 FileExists() 实现中。 GetFileAttributes() 不支持通配符,就像 FindFirstFile() 一样。

    1. 请参阅 Why is GetFileAttributes the way old-timers test file existence?

或者,您可以在打开文件之前根本不检查文件是否存在,只需无条件打开它并捕获由此产生的错误。操作系统会告诉您失败是否是由于找不到文件或其他错误造成的。

关于delphi - FileExists 返回 true 但文件不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55424510/

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