Директория.GetDirectoryRoot неправильно обрабатывает пути символов Max Path
IOUtils.Директория.GetDirectoryRoot (Folder) выдает мне ошибку, когда 'Folder' имеет длину 259 символов (да, он включает разделитель в конце):
Тестер Проекта.exe вызвал исключение класса EPathTooLongException с сообщение "указанный путь слишком длинный".
Я думал, что могу использовать до 260 символов в путях.
Почему GetDirectoryRoot не принимает пути, содержащие символы Max_Path?
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+сдвиг+F и проверьте весь ваш код:)
В любом случае, конфликт остается: допустимый путь (260 символов), возвращенный некоторым вызовом API, не может быть передан
IOUtils
который принимает только 248 символов. Если вы найдете лучшее решение, дайте мне / нам знать, и я приму ваш ответ:)