DirectoryExists ("c: temp \\ foo") возвращает true, если каталог не существует! - PullRequest
12 голосов
/ 16 ноября 2010

Ладно, у меня получилось немного странно. Я понимаю, что это была моя ошибка - неправильно отформатировать путь, но я ожидаю, что следующий тест вернет false, тем более что папка не существует.

DirectoryExists("C:temp\\foo")

но на самом деле он возвращает true, даже если каталог не существует!

Код должен быть

DirectoryExists("C:\\temp\\foo")

Может кто-нибудь объяснить мне, почему я получаю ложный положительный результат от первой версии? Я ожидаю, что он вернет false или, возможно, выдаст исключение, но не вернет true.

1 Ответ

21 голосов
/ 16 ноября 2010

Этот API работает правильно, но часто появляется некорректно, когда вы впервые сталкиваетесь с таким поведением.Пропуск \ после буквы тома имеет особую семантику.Он заменит спецификатор тома значением, переданным в последнем вызове SetCurrentDirectory для этого тома.Как это запоминается, обсуждается здесь

В этом случае последнее переданное значение было либо c:\, либо текущий каталог просто не былзадавать.Следовательно, вызов фактически стал второй версией

Directory.Exists("c:\\temp\\foo")

Это правильно оценивается как истинное

Почему это происходит для Directory.Exists настолько глубоко, глубоко в функции, которую он использует GetFullPathName, который опирается на это поведение (см. Связанную документацию).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...