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,我会接受您的回答:)
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,我会接受您的回答:)