Почему это System.IO реализовано таким образом


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

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

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

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

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

2 4

2 ответа:

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

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

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

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

От MSDN - путь.Комбинировать Метод (Строка, Строка):

Если путь 1 не является ссылкой на диск (то есть "C:" или "D:") и не заканчивается допустимым символом разделителя, как определено в DirectorySeparatorChar, AltDirectorySeparatorChar или VolumeSeparatorChar, DirectorySeparatorChar добавляется к пути 1 перед конкатенацией.

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