为什么System.IO以这种方式实现

时间:2011-10-27 12:47:01

标签: c# path directory filepath .net

我花了一些时间在我的代码中找到这个错误。尝试创建临时测试目录:

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

因此创建目录C:\test。它似乎只是在执行程序集的本地文件夹中创建目录test

这是因为Path.Combine("C:", "test");返回C:test,而不是C:\test

我不会假装对文件系统了解太多,所以也许这个原因应该是显而易见的,但我不明白。我不确定他们为什么以这种方式实施Path,或者为什么CreateDirectory不会抱怨目录名称无效。

2 个答案:

答案 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