IOUtils.TDirectory.GetDirectoryRoot(Folder) 在“文件夹”长度为 259 个字符时给我一个错误(是的,它在末尾包含 \ 分隔符):
项目 Tester.exe 引发异常类 EPathTooLongException,并带有消息“指定的路径太长”。
为什么 GetDirectoryRoot 不接受 Max_Path 字符的路径?
IOUtils.TDirectory.GetDirectoryRoot(Folder) 在“文件夹”长度为 259 个字符时给我一个错误(是的,它在末尾包含 \ 分隔符):
项目 Tester.exe 引发异常类 EPathTooLongException,并带有消息“指定的路径太长”。
为什么 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;
这是这个“精彩”功能的用户手册:
返回给定路径的根目录。
使用 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 个字符)不能传递给IOUtils
它只接受 248 个字符。如果您找到更好的解决方案,请告诉我/我们,我会接受您的回答 :)