我有点困惑.我认为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
所有这些都是有效的途径:
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