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。

\IMO,在.NET中排除作为根更有意义。AFAIK,这在任何 Windows 操作系统上都不是有效的根目录(\\可以)。然后我可以组合部分路径,而不用担心部分路径是否以\.

为什么这种方法设计为考虑单个\根?

4

1 回答 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 哪里不允许您以“\”开头的路径在当前驱动器中对其进行根目录?

为什么这种方法设计为考虑单个 \ 一个根?

我认为更大的问题是为什么你开始了你想要的相对路径\

于 2013-03-27T20:35:30.683 回答