FileExists返回true,但文件不存在

Tom*_*Tom 3 delphi delphi-7

我用Delphi 7编写程序。我只需要在非Unicode文件名上工作即可。如果找到Unicode文件名,则应忽略它。

我的代码如下所示:

var Filename: String;

if not FileExists(Filename) then Exit;

F := TFileStream(Filename, fmOpenRead or fmShareDenyWrite);
Run Code Online (Sandbox Code Playgroud)

但是,在某些Unicode文件名的情况下,FileExists()返回true,但随后TFileStream引发异常,因为路径无效。

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

function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;
Run Code Online (Sandbox Code Playgroud)

FileAge()定义为:

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

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

所以问题很重要:

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

要么

2)应该使用什么功能代替FileExists以获得正确的结果?

Rem*_*eau 11

  1. TFileStream,不。但是您可以改用Win32 CreateFileW()打开Unicode文件名,然后将返回值分配HANDLETHandleStream。这实质上是TFileStream内部操作(CreateFileA()在Delphi 7中使用)。

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

    1.请参阅为什么GetFileAttributes是旧式测试文件存在的方式?

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