Ошибки и Исключения: Тестирование DirectoryExists с Сетевыми Путями в Delphi XE
В статье рассматривается проблема, связанная с функцией DirectoryExists из модуля SysUtils в среде разработки Delphi XE при работе с сетевыми путями. Эта проблема проявляется в неожиданном поведении функции при определении существования каталогов, особенно когда используются сетевые маппинги.
Описание проблемы
При вызове функции DirectoryExists с указанием сетевого пути в формате Y:\blabla\, где Y - это сетевой маппинг, функция корректно возвращает false, если указанный каталог не существует. Однако, если в качестве аргумента передать путь в формате Y:\blabla\Y:\bla, функция возвращает true. Это нелогичное поведение, которое не описано в документации и не обсуждалось в сообществах разработчиков.
Подтвержденный ответ
Исходя из предоставленных данных, проблема заключается в ошибке реализации функции DirectoryExists. Примерный код функции показывает, что при неудачном вызове GetFileAttributes функция проверяет возвращаемое значение GetLastError на соответствие определенному набору кодов ошибок. В случае с некорректным путем функция возвращает код ошибки ERROR_BAD_PATHNAME (161), что приводит к возвращению true вместо ожидаемого false.
Альтернативный ответ и решения
В более новых версиях Delphi, таких как XE3, проблема была исправлена. Однако, на момент обсуждения, ошибка присутствовала и в последующих версиях, включая XE8. Предлагается обернуть вызов функции DirectoryExists в дополнительную логику, которая будет исключать возможность возврата true в случае, если GetFileAttributes возвращает INVALID_FILE_ATTRIBUTES. Пример такой функции:
DirectoryUsable(const Directory: string; FollowLink: Boolean = True): Boolean;
begin
Result := GetFileAttributes(PChar(Directory)) <> INVALID_FILE_ATTRIBUTES;
if Result then Result := DirectoryExists( Directory, FollowLink );
end;
Также можно использовать функцию PathIsDirectory для предварительной проверки пути. Важно отметить, что при работе с пользовательским вводом необходимо тщательно валидировать данные, чтобы предотвратить передачу некорректных путей.
Заключение
При работе с сетевыми путями в Delphi XE и последующих версиях, следует быть внимательным к поведению функции DirectoryExists, особенно при передаче сложных или неоднозначных путей. Рекомендуется использовать дополнительные проверки и, при необходимости, обертывать вызовы этой функции в дополнительную логику для корректного определения существования каталогов.
Обсуждается проблема с функцией `DirectoryExists` в Delphi XE при работе с сетевыми путями, связанная с ошибочным возвратом `true` при наличии в пути дублируемой части сетевого маппинга.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.