为什么是系统?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
没有抱怨无效的目录名。
好吧,您正在组合驱动器号和名称。在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的回答