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

Bud*_*rot 18 c# string

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

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

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

在那种情况下,字符串必须字面上是"C:\\ Users \\ text.txt" - 因为之前的"@" - 这不是一个有效的Windows路径(编辑:这是错误的,它是一个有效的路径,只有资源管理器不接受它 - 感谢Muctadir Dinar),为什么这个有效呢?

提前致谢

Ser*_*kiy 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});
Run Code Online (Sandbox Code Playgroud)

输出:

C:\ Users \用户的text.txt


Nic*_*ler 5

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

C:\Users\text.txt
C:\\Users\\text.txt
C:\\\Users\\\text.txt
C:\\\\Users\\\\text.txt
Run Code Online (Sandbox Code Playgroud)

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

所以你的@"C:\\Users\\text.txt"代表"C:\\\\Users\\\\text.txt"是有效的

你可以打电话Path.GetFullPath("")来获得绝对路径.

例如:

Console.WriteLine(@"C:\\Users\\text.txt");
Console.WriteLine(Path.GetFullPath(@"C:\\Users\\text.txt"));
Run Code Online (Sandbox Code Playgroud)

输出:
C:\\ Users \\ text.txt
C:\ Users\text.txt