Директория.GetDirectoryRoot неправильно обрабатывает пути символов Max Path


IOUtils.Директория.GetDirectoryRoot (Folder) выдает мне ошибку, когда 'Folder' имеет длину 259 символов (да, он включает разделитель в конце):

Тестер Проекта.exe вызвал исключение класса EPathTooLongException с сообщение "указанный путь слишком длинный".

Я думал, что могу использовать до 260 символов в путях.
Введите описание изображения здесь

Почему GetDirectoryRoot не принимает пути, содержащие символы Max_Path?

1 2

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