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

4

我花了一段时间才找到代码中的错误。试图创建一个临时测试目录:

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

所以这段代码并没有创建目录C:\test,它似乎只是在执行程序的本地文件夹中创建了一个test目录。
这是因为Path.Combine("C:", "test")返回C:test而不是C:\test
我并不是很懂文件系统,也许原因显而易见,但我不理解。我不确定为什么他们要这样实现Path,或者为什么CreateDirectory不会抱怨无效的目录名。
2个回答

11

在 Windows 中,你正在将驱动器号和名称组合在一起。这意味着“该驱动器当前目录下的名称”。例如:

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

这将创建 c:\foo\bar。在我看来,这似乎与Windows的设计一致(回溯到MS-DOS)- 这不一定是Windows的明智设计,但对于.NET保持一致是有意义的。


这更多是关于 MS-DOS 2 的设计,大约在1982年左右。 - H H
哇,非常奇怪。嗯,在一种“我不知道你能这样做”的方式下,这很有道理。 - fearofawhackplanet

9

Path.Combine这样做的原因是:是一个有效的VolumeSeparatorChar,所以不会在C:后面追加\

来自MSDN - Path.Combine 方法 (String, String)

如果path1不是驱动器引用(即“C:”或“D:”),并且未以DirectorySeparatorChar、AltDirectorySeparatorChar或VolumeSeparatorChar定义的有效分隔符字符结尾,则在连接之前会将DirectorySeparatorChar追加到path1。

至于CreateDirectory的行为,请参见Jon Skeet的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接