【问题标题】:TDirectory.GetDirectoryRoot does not handle correctly paths of Max_Path charactersTDirectory.GetDirectoryRoot 不能正确处理 Max_Path 字符的路径
【发布时间】:2017-05-23 18:04:33
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我的路径是 259 个字符。因此,#0 终止符有一个额外的字符可用。但无论如何,我在德尔福工作。 Delphi 不在字符串中使用 #0 终止符。
  • 我假设这是在幕后调用 Windows api 函数,在这种情况下,最终需要空终止符。仍然没有解释为什么 259 太长。可能与具体路径有关。
  • 我受够了 IOUtils 库。它的错误比代码行多。编程语言的生产者如何在市场上发布完全没有功能的库?他们是如何通过这个产品从我们这里榨取这么多钱的?抱歉……其实我知道……他们强迫我们购买那些该死的“更新订阅”
  • 众所周知的设计缺陷,从 .net 库 IIRC 复制而来。最好自己动手。 IOUtils 不好。 Windows 10 现在允许您完全绕过该限制,并且您始终可以使用 `\\?` 前缀来允许更长的路径。
  • 我不认为这是他们打算解决的问题,因为他们认为这是设计好的

标签: delphi delphi-xe7 ioutils delphi-strings


【解决方案1】:

这就是原因:

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-06-05
  • 1970-01-01
  • 2011-06-22
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多