Почему System.IO реализован таким образом - PullRequest
4 голосов
/ 27 октября 2011

Мне понадобилось время, чтобы найти эту ошибку в моем коде. Попытка создать временный тестовый каталог:

Path.Combine("C:", "test"); 
Directory.CreateDirectory(path);

Так что не создает каталог C:\test. Кажется, просто создайте каталог test в локальной папке исполняемой сборки.

Это потому, что Path.Combine("C:", "test"); возвращает C:test, а не C:\test.

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

Ответы [ 2 ]

11 голосов
/ 27 октября 2011

Ну, вы комбинируете букву диска и имя.Под Windows это означает «имя в текущем каталоге этого диска».Так, например:

C:\> cd foo
c:\foo> d:
d:\> mkdir c:bar

, что создаст c:\foo\bar.Поэтому мне кажется, что это согласуется с дизайном Windows (возвращаясь к MS-DOS) - это не обязательно разумный дизайн для Windows, но для .NET имеет смысл быть с ним совместимым.

9 голосов
/ 27 октября 2011

Path.Combine ведет себя так, потому что : является действительным VolumeSeparatorChar - поэтому \ не добавляется к C:.

из MSDN- Метод Path.Combine (String, String) :

Если path1 не является ссылкой на диск (то есть «C:» или «D:») и неоканчиваться действительным символом-разделителем, как определено в DirectorySeparatorChar, AltDirectorySeparatorChar или VolumeSeparatorChar, DirectorySeparatorChar добавляется к path1 перед объединением.

Что касается поведения CreateDirectory - см. ответ Джон Скит.

...