2013-09-23 121 views
18

我有点困惑。我认为c#中的“@”是一个标志,用于像@“C:\ Users ...”那样逐字地解释文本。它避免了需要双反斜杠。为什么即使路径包含@之前的路径,路径也能工作“\”

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

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

我这种情况下,必须将字符串字面意思是“C:\\ \\用户的text.txt” - 以前的,因为“@” - 这是不是一个有效的Windows路径(编辑:多数民众赞成错了,它是一个有效的路径,只有探险家不会接受它 - 感谢Muctadir Dinar),那么为什么这个工作?

在此先感谢

+13

多路径分隔符被解释为单路径分隔符。 –

+4

这是一条有效的路径。在具有多路径分隔符的命令提示符(cmd)中尝试cd命令。 – Muctadir

+0

谢谢Muctadir Dinari,我在资源管理器中试过这个会引发错误,我没有想过cmd。也感谢gp,这是很重要的知道(我搜索Msdn之前,没有找到任何东西)。 – BudBrot

回答

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

感谢您的详细和解释良好的答案。 – BudBrot

+1

@Pengu欢迎:)您可以使用反射器等反汇编器调查NormalizePath实现。顺便说一句,删除双反斜杠非常简单 - 当通过char检查路径char时,它会检查当前char是否是目录separator char。如果是这样,那么分隔符被追加到结果中,并且标志(它表明最后添加的字符是目录分隔符)被更改为“true”。所有其他目录分隔符字符将不会被添加到结果,直到找到一些非分隔符字符(这将重置标志) –

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

string @“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框架的未来版本中改变...