Delphi TDirectory.GetDirectoryRoot无法正确处理最大路径字符的路径

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

IOUtils.TDirectory.GetDirectoryRoot(文件夹)在“Folder”的长度为259个字符时给我一个错误(是的,它在末尾包含\分隔符):

Project Tester.exe引发异常类EPathTooLongException,异常为 消息“指定的路径太长”

我认为我可以在路径中使用多达260个字符。

为什么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中类似错误的设计证据:If
FCMinFileNameLen=12
,我想知道你是如何传递长度为256的字符串的。