IOUtils.TDirectory.GetDirectoryRoot(Folder)在'Folder'长度为259个字符时给出错误(是的,它在结尾处包含\ separator):
Project Tester.exe引发异常类EPathTooLongException with 消息'指定的路径太长'。
虽然我可以在路径中使用多达260个字符 docs
为什么GetDirectoryRoot不接受Max_Path字符的路径?
答案 0 :(得分: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 + Shift + F 并检查所有代码:)
无论如何,冲突仍然存在:某些API调用返回的有效路径(260个字符)无法传递给只接受248个字符的IOUtils
。如果您找到更好的解决方案,请告诉我/我们,我会接受您的回答:)