【问题标题】:Why is System.IO implemented this way为什么 System.IO 是这样实现的
【发布时间】:2011-10-27 12:47:01
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# path directory filepath .net


    【解决方案1】:

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

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

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

    【讨论】:

    • 这更像是 MS-DOS 2, 1982 左右的设计。
    • 哇。多么奇怪。嗯,这是有道理的,有点像“我不知道你能做到”。
    【解决方案2】:

    Path.Combine 的行为方式是这样的,因为 : 是有效的 VolumeSeparatorChar - 所以 \ 不会附加到 C:

    来自 MSDN - Path.Combine Method (String, String):

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

    至于 CreateDirectory 的行为 - 请参阅 Jon Skeet 的 the answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多