System.IO.Directory.Exists не работает должным образом

Когда строка "D:\test\..." передается методу System.IO.Directory.Exists, он возвращает True на моей машине. Я проверил следующий код;

public static void Main(string[] args)
{
    if (Directory.Exists("D:\\test\\..."))
        Console.WriteLine("Directory exist.");  //Control gets here
    else
        Console.WriteLine("Does not exist.");
}

Это происходит, даже если каталог с именем "..." (тройные точки) не существует в указанном месте.

Дальнейшее исследование этого показывает, что каким-то образом внутри он проверяет только «D:», полностью игнорируя последнюю часть строки. Поскольку родительский каталог существует, он возвращает значение true.

Я хочу знать, есть ли способ проверить, не обрезая конечные точки?

Существуют ли такие сценарии, когда результат метода Directory.Exists может отличаться от ожидаемого?

Обновление: если я введу ту же строку "D:\test\..." в адресную строку проводника Windows и нажму Enter, он сможет определить, что не может найти такой каталог . Есть ли способ получить подобное поведение?

Примечание. Я знаю, что каталог с таким именем не может существовать, но я получаю входную строку от пользователя, поэтому ввод для этого метода может быть любым.


person Kamalesh Wankhede    schedule 29.08.2018    source источник
comment
Сначала передайте текст через IO.Path.GetFullPath(), он обработает эти точки и даст вам знать, о чем на самом деле думает файловая система. Три точки будут интерпретироваться как точка-точка=вверх, затем точка=здесь. Другой вымышленный файл - NUL, и я думаю, что старые COM1, COM2 и т. д. все еще существуют.   -  person Davesoft    schedule 29.08.2018
comment
Никогда не вызывайте эту функцию. В спецификации есть ошибка.   -  person Joshua    schedule 29.08.2018
comment
... в любом случае будет недопустимым каталогом, вы не можете создать такой каталог.   -  person Tim Schmelter    schedule 29.08.2018
comment
input string from user, so input to this method could be anything ... ладно, но иногда даже пользователям нужно включить мозг ;)   -  person nilsK    schedule 29.08.2018
comment
Возможный дубликат относительно одиночной и двойной точки в каталогах   -  person Igor    schedule 29.08.2018
comment
Note: I know that directory with such name can not exist but I am getting input string from user, so input to this method could be anything. ‹= Не доверяйте пользовательскому вводу! Никогда! Всегда проверяйте и очищайте его, прежде чем что-либо с ним делать.   -  person Igor    schedule 29.08.2018
comment
@Igor, как я могу проверить ввод пользователя в этом случае? Если путь C:\test\... означает C: для системы, есть ли способ считать его таким, какой он есть, и сказать, что каталог с именем ... не существует (или не может) существовать.   -  person Kamalesh Wankhede    schedule 29.08.2018
comment
Сразу на ум приходят 2 варианта: 1. Регулярное выражение на входе с разрешенными символами. 2. Получите абсолютный путь (объедините ввод с любым каталогом, к которому вы его применяете) и посмотрите, находится ли он в каком-либо каталоге, к которому он должен быть ограничен.   -  person Igor    schedule 29.08.2018
comment
@Igor, я только что проверил ту же строку в адресной строке проводника Windows. Там его в состоянии правильно идентифицировать. Это показывает, что он не может найти такой каталог. Я хочу подобного поведения.   -  person Kamalesh Wankhede    schedule 29.08.2018
comment
I want similar behavior. ‹= Так работает API. Если вы хотите что-то еще, вам нужно написать это самостоятельно, найти другую библиотеку или отправить запрос на билет в Microsoft, чтобы изменить поведение (хотя не задерживайте дыхание на этом). Или вы можете сделать то, что я предложил выше, и выбрать один из этих двух довольно простых в реализации элементов.   -  person Igor    schedule 29.08.2018
comment
Также, если вы используете команду DOS, ошибки нет: CD Test\... работает просто отлично.   -  person Igor    schedule 29.08.2018


Ответы (2)


Я думаю, что это поведение Win32.

На самом деле, если я создам папку с именем ... с помощью команды ниже (создание папки обычным способом не позволяет):

mkdir \\?\c:\...

Папка ... сама перенаправляет на C:\. Поэтому я думаю, что папка ... представляет текущую папку (в данном случае C:\) и существует всегда.

person Antoine V    schedule 29.08.2018

Потому что вы снова идете на диск "D:\".

Выражение escape-символа "D:\test\..." означает диск с именем "D", и он там есть.

Если вы измените букву диска. Вы получите «Не существует». Вот ваш ответ.

D:\ --> D:\test --> .. команда и снова D:\.

и вы не можете создать папку с именем "...". вы получите ошибку «Неверный параметр».

person Göksel ÇÜRYAN    schedule 29.08.2018