TDirectory.GetDirectoryRoot 无法正确处理 Max_Path 个字符的路径

TDirectory.GetDirectoryRoot does not handle correctly paths of Max_Path characters

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

Project Tester.exe raised exception class EPathTooLongException with message 'The specified path is too long'.

虽然我可以在路径中使用最多 260 个字符。

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

这就是为什么:

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

这是此 'wonderful' 功能的用户手册:

Returns the root directory for a given path.

Use GetDirectoryRoot to obtain the root directory for a given path. Relative paths are considered relative to the application working directory. The following table lists the parameters expected by this method.

Note: GetDirectoryRoot raises an exception if the given path is invalid or the directory does not exist.

感谢 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+Shift+F 并检查你所有的代码:)

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