Delphi:如何检查一个文件是否存在(路径超过255个字符)

10

我需要让我的Delphi应用程序能够检查使用Robocopy复制的文件是否存在,当文件路径超过255个字符时。 我已经尝试了通常的"If FileExists(MyFile) then ...",但它总是返回"false",即使文件存在。

我还尝试获取文件的日期,但我得到的是1899/12/30,可以认为这是一个空日期。

文件搜索也没有返回任何结果。

1个回答

10

在文件名前面添加\\?\以启用扩展长度路径解析。例如,你可以写成:

\\?\C:\very-long-path\file-name.ext

if FileExists('\\?\'+FileName) then
  ....
请注意,这只能在调用Win32 API函数的Unicode版本时才有效。 因此,如果您使用Unicode Delphi,则可以完成此操作。 否则,您将不得不编写自己的FileExists版本,以调用API函数的Unicode版本。
有关这些问题的讨论详见MSDN:Naming Files, Paths, and Namespaces

感谢您的回复。对于本地路径(例如e:\myfilepath),此解决方案非常有效,但是我在使用UNC路径时仍然遇到了困难,即使使用“If FileExists('\?\UNC'+MyFile) then ...”语句。 - Fab
UNC路径在这里可以正常工作。我非常有信心,我的答案就是你所需要的。其他问题可能出在别处。一旦你有了\\?\前缀,你就已经超越了260个字符的限制。 - David Heffernan
3
@Fab:如果'MyFile'包含标准的UNC路径,那么在添加'\?\UNC'前缀时,需要将其前面的'\'去掉。换句话说,'\server\path'需要变成'\?\UNC\server\path',而不是像你的代码当前所做的那样变成'\?\UNC\\server\path'。 - Remy Lebeau
雷米所说的是准确的。也许那就是你的问题。我链接的文章也是这么说的。 - David Heffernan
Remy是对的,我忘了那一点。我必须使用"If copy(MyFile,0,2)='\' then MyFile:=StringReplace(MyFile, '\', '\?\UNC', [rfReplaceAll, rfIgnoreCase]);"然后FileExists就很好用了。谢谢! - Fab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接