18

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

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

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

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

提前致谢

4

3 回答 3

16

因为FileStream在初始化期间内部调用内部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:\用户\text.txt

于 2013-09-23T12:12:38.753 回答
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:\\Users\\text.txt
C:\Users\text.txt

于 2013-09-23T12:12:21.440 回答
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 框架中更改...

于 2013-09-23T12:27:27.383 回答