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 символов. Если вы найдете лучшее решение, дайте мне знать, и я приму ваш ответ:)

Другие вопросы по тегам