C# 正确转义文件路径

C# 正确转义文件路径,c#,C#,使用变量时,如何使用@符号转义 File.Delete(@"c:\test"); // WORKS! File.Delete(@path); // doesn't work :( File.Delete(@"c:\test"+path); // WORKS 有人知道吗?这是我想用的第二个例子 string path = @"c:\test"; File.Delete(path); 这只适用于字符串。真正的字符串是c:\\test 阅读更多信息。第一条和第三条是实际路径,因此可以工作

使用变量时,如何使用@符号转义

File.Delete(@"c:\test"); // WORKS!

File.Delete(@path); // doesn't work :(

File.Delete(@"c:\test"+path); // WORKS
有人知道吗?这是我想用的第二个例子

string path = @"c:\test"; 
File.Delete(path); 
这只适用于字符串。真正的字符串是c:\\test


阅读更多信息。

第一条和第三条是实际路径,因此可以工作

第二个甚至不会编译,如果

 string path = @"c:\test";
 File.Delete(path);
调用以@character为前缀的字符串,其内容不需要转义

因此,您只能将@与字符串文字一起使用,而不能与字符串变量一起使用


所以,只需File.Deletepath;在您事先从逐字字符串或其他字符串中指定路径后,就可以了

逐字字符串只是一种语法上的精确性,可以更轻松地键入包含反斜杠、路径和正则表达式的字符串。声明

string path = "C:\\test";
string path = @"C:\test";
它们的结果完全相同。两者都会产生一个包含C:\test的字符串。请注意,这两个选项都是必需的,因为C语言将字符串中的\视为特殊的

@不是使路径正常工作所需的魔法精灵,它在字符串前面有一个定义的含义,即字符串在解释时没有通常的\转义序列

第二个示例不能像您预期的那样工作的原因是,变量名的前缀@做了一些不同的事情:它允许您使用保留关键字作为标识符,例如,您可以使用@class作为标识符。对于与关键字不冲突的标识符,结果与不冲突的标识符相同

如果您有一个包含路径的字符串变量,那么您通常可以假定根本不需要转义。毕竟,它已经在一个字符串中。我上面提到的内容需要在运行时通过编译器将源代码中的文本正确地转换为字符串,因为编译器有不同的想法。字符串本身就是始终表示相同的数据


这仍然意味着您必须以反斜杠仍然存在的方式初始化字符串。如果您从某个地方读取它,则无需进行特殊处理,如果您在代码中的其他地方将其作为常量字符串,则必须再次使用顶部的一个选项。

您对@indicator的理解存在一个重大问题

@无论哪个字符串是文本字符串说明符,都是逐字字符串文本。它所做的是告诉C编译器不要寻找转义序列。通常,\是字符串中的转义序列,您可以执行\n指示新行或\t指示制表符之类的操作。但是,如果您有@\n,它会告诉编译器否,我确实希望将反斜杠视为反斜杠字符,而不是转义序列

如果不喜欢文字模式,可以在需要单个反斜杠的任何位置使用\\,因为编译器知道将转义的反斜杠视为单个字符

在任何一种情况下,@\n和\\n都将在内存中生成一个两个字符的字符串,其中包含字符“\”和“n”。不管你走哪条路到那里;这两种方法都可以告诉编译器您需要这两个字符

有鉴于此,@path毫无意义,因为您没有任何文字字符,只有一个变量。当您拥有变量时,您已经在内存中拥有了所需的字符。正如Joey所解释的,它确实可以编译,但从逻辑上讲,它不是你想要的

如果您正在寻找一种方法来消除变量中出现的\\,您只需要字符串。替换:


为什么要使用第二个示例?为什么需要在这里使用文本字符串?删除调用…@Lasse:我想他们认为在字符串中的路径前面加上@是一种神奇的方法。“总是在路径前面加上@,否则它们就不起作用了”。我可以看出,一个人如果没有适当的指导或培训,可能会这样想,完全忘记了实现这一目标的实际语言特征。对于编译器,@path也没有错,只是出于其他原因。您需要注意的是,您的第三个示例相当于@c:\test+path@James这只是一个例子。我只是在我的头顶上取了一个随机函数来做一个例子!谢谢,先生。我不知道为什么我没有想到这个呵呵。回答得好。但是@whater string的技术术语是逐字逐句的string literal,而不是literal string。@Scott Mermelstein您不必对我对@indicator的理解无礼。我是在寻求帮助,而不是你对我缺乏技能的看法。@DavidLarsson我尽量避免粗鲁,如果你认为我是这样,我很抱歉。你是说你对@的理解没有什么大问题吗?我觉得这是我最粗鲁的陈述。@krumia出于某种原因,当我看到Marcel回答中的正确术语时,我不想回去改变我的回答,但我现在已经在我的回答中修正了它。@DavidLarsson:按照StackOverflow的标准,我不认为他是正确的 他太粗鲁了。我们不一定把对某事物缺乏理解视为缺乏技能从你的问题可以明显看出,你缺乏理解,顺便说一句,这是完全正确的。
string ugly = @"C:\\foo";
ugly = ugly.Replace(@"\\", @"\");