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

时间:2017-05-23 18:04:33

标签: delphi delphi-xe7 ioutils delphi-strings

IOUtils.TDirectory.GetDirectoryRoot(Folder)在'Folder'长度为259个字符时给出错误(是的,它在结尾处包含\ separator):

  

Project Tester.exe引发异常类EPathTooLongException with   消息'指定的路径太长'。

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

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

1 个答案:

答案 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。如果您找到更好的解决方案,请告诉我/我们,我会接受您的回答:)