为什么一个路径即使在“\\”之前包含@也能工作

时间:2013-09-23 12:06:48

标签: c# string

我有点困惑。我认为c#中的“@”是一个用来解释文字的标志,就像@“C:\ Users ...”一样。它避免了双反斜杠的需要。

但是如果路径包含双反斜杠和@,为什么路径也可以工作? Fe:

var temp = File.ReadAllText(@"C:\\Users\\text.txt").ToString(); // no error

我的情况下,字符串必须字面上是“C:\\ Users \\ text.txt” - 因为之前的“@” - 这不是一个有效的Windows路径(编辑:这是错误的,它是一个有效的路径,只有探险家不会接受它 - 感谢Muctadir Dinar),为什么这样做呢?

提前致谢

3 个答案:

答案 0 :(得分:16)

因为初始化期间内部FileStream会调用iternal Path.NormalizePath(path, true, maxPathLength)方法来规范化传递的路径值。

您可以使用反射调用此方法(它有重载,因此获取MethodInfo有点棘手):

string path = @"C:\\Users\\text.txt";
Type type = typeof(Path);
var flags = BindingFlags.Static | BindingFlags.NonPublic;
var binder = Type.DefaultBinder;
var types = new Type[] { typeof(string), typeof(bool), typeof(int) };
var modifiers = new ParameterModifier[0];

var normalize = type.GetMethod("NormalizePath", flags, binder, types, modifiers);
var result = normalize.Invoke(null, new object[] { path, true, 256});

输出:

  

C:\ Users \用户的text.txt

答案 1 :(得分:5)

所有这些都是有效的路径:

C:\Users\text.txt
C:\\Users\\text.txt
C:\\\Users\\\text.txt
C:\\\\Users\\\\text.txt

"\\"代表"\"
@"\"代表"\"
@"\\"代表"\\"
"\\\\"代表"\\"

因此,@"C:\\Users\\text.txt"代表有效的"C:\\\\Users\\\\text.txt"

您可以致电Path.GetFullPath("")获取绝对路径。

例如:

Console.WriteLine(@"C:\\Users\\text.txt");
Console.WriteLine(Path.GetFullPath(@"C:\\Users\\text.txt"));
  

输出:
  C:\\ \\用户的text.txt
  C:\ Users \用户的text.txt

答案 2 :(得分:2)

字符串@“C:\ Users \ text.txt”将使用重复的反斜杠字符进行解析,但系统会将这些重复字符视为一个而忽略它们。 例如,此代码也可以工作:

string s=File.ReadAllText(@"C:\\\Users\\\text.txt");

或:

string s=File.ReadAllText(@"C:\\\\\\\\\\\\Users\\\\\\\\\\\text.txt");

但这样做并不是一个好主意。 如果你遍历这些路径字符串中的字符,你会发现实际上有几个反斜杠字符。

foreach (char c in @"C:\\\Users\\\text.txt") ...
  

注意:您应该避免将多个反斜杠指定为文件夹分隔符,因为此行为不可靠,并且可能在以后版本的操作系统或.net框架中更改...