但是如果路径包含双反斜杠和@,为什么路径也可以工作? Fe:
var temp = File.ReadAllText(@"C:\\Users\\text.txt").ToString(); // no error
我的情况下,字符串必须字面上是“C:\\ Users \\ text.txt” - 因为之前的“@” - 这不是一个有效的Windows路径(编辑:这是错误的,它是一个有效的路径,只有探险家不会接受它 - 感谢Muctadir Dinar),为什么这样做呢?
提前致谢
答案 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框架中更改...