Delphi FileExists不适用于带\\的长路径\

Delphi FileExists不适用于带\\的长路径\,delphi,Delphi,根据Microsoft[1]和其他网页的建议,我在Delphi中的路径/文件字符串前面添加了额外的四个字符“\\?\”。这允许我绕过使用FileExists时出现的错误(这意味着它可以正确找到文件并返回“True”而不是“False”) 但是,将同一字符串传递给Assign()或AssignFile()时,该字符串无法正常工作 在此阶段,文件名如下所示 “\\?\C:\Users\xyz\xyz\ONELONGWORD\xyz\xyz\namer.abc” 我得到的错误是 使用此代码段: pro

根据Microsoft[1]和其他网页的建议,我在Delphi中的路径/文件字符串前面添加了额外的四个字符
“\\?\”
。这允许我绕过使用
FileExists
时出现的错误(这意味着它可以正确找到文件并返回“True”而不是“False”)

但是,将同一字符串传递给
Assign()
AssignFile()
时,该字符串无法正常工作

在此阶段,文件名如下所示

“\\?\C:\Users\xyz\xyz\ONELONGWORD\xyz\xyz\namer.abc”

我得到的错误是

使用此代码段:

procedure xyz(file_name : string; var FID: TextFile;)
.....
.....
.....
assignfile(FID,file_name);
rewrite(FID); // 
我在
AssignFile
行中得到无效的文件名错误

用这个片段

procedure xyz(file_name : string; var FID: TextFile;)
.....
.....
.....
assign(FID,file_name);
rewrite(FID); // 
我在
rewrite
行中得到了不可接受的值错误

你知道怎么解决这个问题吗

我使用的是Delphi10.X


[1] AssignFile对文件名有硬编码限制:259个字符


AssignFile是pascal的遗留文件I/O的一部分,因为它始终是。这个已经被替换了。使用
TFileStream
或类似工具。还可以查看
System.IOUtils
单元中的
TFile
TPath
TDirectory
和其他文件。

停止使用旧文件I/O,切换到流和读写器类。这就是修复它的方法。你为什么要使用由来已久的
AssignFile()
而不是现代的东西,比如
TFileStream
TStream(Reader | Writer)
TFile
,等等?这是一个遗留代码,切换意味着更改>2000行(当然,首先找到它们):=)并确保刀具链的其余部分没有损坏。但我可以看出,这是唯一一个无法单独解释所报告行为的解决方案(远离“分配”)。如果rtl是用CreateFileA打开文件,会有什么解释呢;SetCurrentDir(长路径)--->AssignFile(短名称)--->writefile-->返回上一个directory@user你可以自己回答这个问题。但是,如果您能够找到所有需要执行此操作的地方,那么您也可以轻松地正确修复代码。此外,当前的目录黑客不是线程安全的。