Delphi TDirectory.GetDirectoryRoot无法正确处理最大路径字符的路径
IOUtils.TDirectory.GetDirectoryRoot(文件夹)在“Folder”的长度为259个字符时给我一个错误(是的,它在末尾包含\分隔符): Project Tester.exe引发异常类EPathTooLongException,异常为 消息“指定的路径太长” 我认为我可以在路径中使用多达260个字符。Delphi TDirectory.GetDirectoryRoot无法正确处理最大路径字符的路径,delphi,delphi-xe7,ioutils,delphi-strings,Delphi,Delphi Xe7,Ioutils,Delphi Strings,IOUtils.TDirectory.GetDirectoryRoot(文件夹)在“Folder”的长度为259个字符时给我一个错误(是的,它在末尾包含\分隔符): Project Tester.exe引发异常类EPathTooLongException,异常为 消息“指定的路径太长” 我认为我可以在路径中使用多达260个字符。 为什么GetDirectoryRoot不接受最大路径字符数的路径?这就是为什么: class procedure TDirectory.InternalCheckDi
为什么GetDirectoryRoot不接受最大路径字符数的路径?这就是为什么:
class procedure TDirectory.InternalCheckDirPathParam(const Path: string; const ExistsCheck: Boolean);
begin
TPath.CheckPathLength(Path, MAX_PATH {$IFDEF MSWINDOWS}- TFile.FCMinFileNameLen{$ENDIF});
...
end;
这是这个“奇妙”功能的用户手册:
返回给定路径的根目录
使用GetDirectoryRoot获取给定路径的根目录。
相对路径被认为是相对于应用程序工作的路径
目录下表列出了此操作所需的参数
方法
注意:如果给定路径为,GetDirectoryRoot将引发异常
无效或目录不存在
感谢Embarcador/Idera提供这项高质量的工作
因此,
IOutils
不能与Max\u Path
结合使用。它到处使用InternalCheckDirPathParam
解决方案是定义自己的MaxPath
常量:
{$IFDEF MSWINDOWS}
MAXPATH= MAX_PATH- 12; { TFile.FCMinFileNameLen = 12. There is a problem in IOUtils and we cannot user Max_Path. }
{$ELSE}
MAXPATH= MAX_PATH;
{$ENDIF}
现在,执行Ctrl+Shift+F并检查所有代码:)
无论如何,冲突仍然存在:某个API调用返回的有效路径(260个字符)无法传递到只接受248个字符的
IOUtils
。如果您找到更好的解决方案,请告诉我/我们,我将接受您的回答:)我的路径是259个字符。因此,有一个额外的字符可用于#0终结符。但不管怎样,我在德尔福工作。Delphi不在字符串中使用#0终止符。我假设这是在幕后调用windows api函数,在这种情况下,空终止符最终需要在那里。仍然无法解释259太长的原因。这可能与特定的路径有关。我被IOUtils库烦透了。它的bug比代码行还多。编程语言的生产者如何在市场上发布完全没有功能的库?他们是如何设法从我们这里榨取这么多钱来购买这种产品的?很抱歉其实我知道。。。他们强迫我们买那些该死的“更新订阅”众所周知的设计缺陷,从.net库IIRC复制而来。最好自己滚。IOUtils不好。Windows 10现在允许您完全绕过该限制,并且您可以始终使用“\\?”前缀来允许更长的路径。我不认为这是他们计划解决的问题,因为他们认为这是IOUtils中类似错误的设计证据:IfFCMinFileNameLen=12
,我想知道你是如何传递长度为256的字符串的。