TDirectory.GetDirectoryRoot неправильно обрабатывает пути символов Max_Path
IOUtils.TDirectory.GetDirectoryRoot(Папка) выдает мне ошибку, когда "Папка" имеет длину 259 символов (да, в конце она содержит разделитель \):
Project Tester.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+Shift+F и проверьте весь ваш код:)
В любом случае конфликт остается: действительный путь (260 символов), возвращаемый некоторым вызовом API, не может быть передан IOUtils
который принимает только 248 символов. Если вы найдете лучшее решение, дайте мне знать, и я приму ваш ответ:)