Почему это System.IO реализовано таким образом
Мне потребовалось некоторое время, чтобы найти эту ошибку в моем коде. Попытка создать временный каталог тестов:
Path.Combine("C:", "test");
Directory.CreateDirectory(path);
Таким образом, это не создает каталог C:test
. Похоже, что он просто создает каталог test
в локальной папке исполняемой сборки.
Это потому, что Path.Combine("C:", "test");
возвращает C:test
, а не C:test
.
Я не претендую на то, чтобы много знать о файловых системах, поэтому, возможно, причина этого должна быть очевидной, но я ее не понимаю. Я не уверен, почему они реализовали Path
, что кстати, или почему CreateDirectory
не жалуется на недопустимое имя каталога.
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
- см. Ответ Джона Скита.