我花了一些时间在我的代码中找到这个错误。尝试创建临时测试目录:
Path.Combine("C:", "test");
Directory.CreateDirectory(path);
因此不创建目录C:\test
。它似乎只是在执行程序集的本地文件夹中创建目录test
。
这是因为Path.Combine("C:", "test");
返回C:test
,而不是C:\test
。
我不会假装对文件系统了解太多,所以也许这个原因应该是显而易见的,但我不明白。我不确定他们为什么以这种方式实施Path
,或者为什么CreateDirectory
不会抱怨目录名称无效。
答案 0 :(得分:11)
嗯,你正在组合一个驱动器号和一个名字。在Windows下,表示“该驱动器的当前目录下的名称”。例如:
C:\> cd foo
c:\foo> d:
d:\> mkdir c:bar
会创建c:\foo\bar
。所以它似乎与Windows的设计(回到MS-DOS)一致 - 对于Windows而言,这不一定是一个明智的设计,但是.NET与它一致是有道理的。
答案 1 :(得分:9)
Path.Combine
的行为方式如此,因为:
是有效的VolumeSeparatorChar
- 因此\
不会附加到C:
。
来自MSDN - Path.Combine Method (String, String):
如果path1不是驱动器引用(即“C:”或“D:”)并且不以DirectorySeparatorChar,AltDirectorySeparatorChar或VolumeSeparatorChar中定义的有效分隔符结尾,则在连接之前将DirectorySeparatorChar附加到path1
至于CreateDirectory
的行为 - 请参阅Jon Skeet的the answer。