2

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

项目 Tester.exe 引发异常类 EPathTooLongException,并带有消息“指定的路径太长”。

我虽然可以在路径中使用多达 260 个字符。
在此处输入图像描述

为什么 GetDirectoryRoot 不接受 Max_Path 字符的路径?

4

1 回答 1

2

这就是为什么:

class procedure TDirectory.InternalCheckDirPathParam(const Path: string; const ExistsCheck: Boolean);
begin
  TPath.CheckPathLength(Path, MAX_PATH {$IFDEF MSWINDOWS}- TFile.FCMinFileNameLen{$ENDIF});
 ...
end;

这是这个“精彩”功能的用户手册:

返回给定路径的根目录。

使用 GetDirectoryRoot 获取给定路径的根目录。相对路径被认为是相对于应用程序工作目录的。下表列出了此方法预期的参数。

注意:如果给定路径无效或目录不存在,GetDirectoryRoot 会引发异常。

感谢 Embarcadeor/Idera 提供这项高质量的工作!


因此,IOutils不能与 结合使用Max_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++ShiftF检查你所有的代码:)

无论如何,仍然存在冲突:某些 API 调用返回的有效路径(260 个字符)不能传递给IOUtils它只接受 248 个字符。如果您找到更好的解决方案,请告诉我/我们,我会接受您的回答 :)

于 2017-05-23T18:32:56.020 回答