为什么是系统?IO就是这样实现的

本文关键字:就是这样 实现 IO 系统 为什么 | 更新日期: 2023-09-27 18:12:28

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

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

所以这个不会创建目录C:'test。它似乎只是在执行程序集的本地文件夹中创建目录test

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

我不想假装对文件系统很了解,所以这样做的原因应该是显而易见的,但是我不明白。我不确定为什么他们这样实现Path,或者为什么CreateDirectory没有抱怨无效的目录名。

为什么是系统?IO就是这样实现的

好吧,您正在组合驱动器号和名称。在Windows下,这意味着"该驱动器当前目录下的名称"。例如:

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

将创建c:'foo'bar。在我看来,这似乎与Windows的设计(回想起MS-DOS)是一致的——这对Windows来说不一定是一个明智的设计,但对于。net来说,与之一致是有意义的。

Path.Combine的行为是这样的,因为:是一个有效的VolumeSeparatorChar -所以'不会被附加到C:

来自MSDN - Path。组合方法(字符串,字符串):

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

关于CreateDirectory的行为-参见Jon Skeet的回答