路径合并出现意外行为

3
给定代码:
   string p = @"C:\Users\Brian";
   string p2 = @"\bin\Debug";
   string result = Path.Combine(p, p2);//result: \bin\Debug
   Console.WriteLine(result);

我期望看到的结果是:

  C:\Users\Brian\bin\Debug

然而,结果是:
  \bin\Debug

如果我初始化p2 = @"bin\Debug";,那么结果符合预期。从MSDN上看,这似乎是按设计工作的:
如果path2不包括根目录(例如,如果path2不以分隔符字符或驱动器规范开头),则结果是两个路径的连接,并插入一个分隔符字符。如果path2包括根目录,则返回path2。
在我的看法中,在.NET中将\排除为根目录更有意义。据我所知,在任何Windows操作系统上都不是有效的根目录(可以是\\)。然后,我可以组合部分路径,而不必担心部分路径是否以\开头。
为什么这个方法被设计成将单个\视为根目录?

你尝试过 cd \ 或 dir \ 吗? - Brian Rasmussen
1个回答

6

为什么这个方法被设计为只考虑单个 \ 作为根目录?

因为对于其他操作来说,它 就是 根目录。例如,在命令提示符中:

c:\Users\Jon\Test>dir \
 Volume in drive C is Windows8_OS
 Volume Serial Number is C058-6ADE

 Directory of c:\

或者使用.NET中的其他文件操作:

using System;
using System.IO;

class Test
{
    static void Main()
    {
        var lines = File.ReadAllLines(@"\Users\Jon\Test\Test.cs");
        Console.WriteLine(lines.Length);
    }
}

输出:

11

或者从Java语言中:

import java.io.*;
public class Test {

    public static void main(String[] args) throws Exception {
        String path = "\\Users\\Jon\\Test\\Test.java";
        // Just to prove that the double backslashes are language escapes...
        System.out.println(path);

        // Obviously we'd normally clean stuff up...
        InputStream stream = new FileInputStream(path);
        BufferedReader reader = new BufferedReader
            (new InputStreamReader(stream, "utf-8"));
        System.out.println(reader.readLine());
    }
}

输出:

\Users\Jon\Test\Test.java
import java.io.*;

我敢说从本地代码也是一样的。

那么,在哪里Windows不允许您以“\”开头来将路径根据当前驱动器进行定位?

为什么这种方法被设计成将单个\视为根目录?

我认为更重要的问题是,为什么你要用\作为起始符号来表示一个相对路径。


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