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 が区切り文字またはドライブ指定で始まらない場合)、結果は 2 つのパスが連結され、その間に区切り文字が挿入されます。path2 にルートが含まれる場合、path2 が返されます。

\IMO、.NETではルートとして除外する方がはるかに理にかなっています。私の知る限り、これはどのWindows OSでも有効なルートではありません(\\可能性があります)。これで、部分パスが\.

このメソッドが単一\のルートを考慮するように設計されているのはなぜですか?

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 に答える