正确转义文件路径

本文关键字:路径 文件 转义 | 更新日期: 2023-09-27 18:17:09

在使用变量时如何使用@-符号进行转义?

File.Delete(@"c:'test"); // WORKS!
File.Delete(@path); // doesn't work :(
File.Delete(@"c:'test"+path); // WORKS

有人知道吗?这是我想用的第二个例子!

正确转义文件路径

@字符为前缀的字符串称为逐字字符串(其内容不需要转义)。

因此,您只能将@用于字符串字面值,而不是字符串变量。

所以,只要File.Delete(path);就行了,当然,在您提前分配路径之后(从逐字字符串或其他字符串)。

逐字字符串只是一种语法上的精确,以便能够更容易地键入包含反斜杠(路径,正则表达式)的字符串。声明

string path = "C:''test";
string path = @"C:'test";

的结果完全相同。两者都产生一个包含C:'test的字符串。请注意,这两个选项都是必需的,因为c#语言将字符串中的'视为特殊的。

@不是使路径正常工作所需的魔法精灵尘,当它作为字符串前缀时,它有一个定义的含义,因为字符串被解释而不需要通常的'转义序列。

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

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

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

string path = @"c:'test"; 
File.Delete(path); 

这只对字符串有效。"real"字符串是"c:''test"

你对@指示符的理解有一个很大的问题。

@"whatever string"是一个字面值字符串说明符逐字面值字符串。它的作用是告诉c#编译器不要查找转义序列。通常,"'"是字符串中的转义序列,您可以执行"'n"来指示新行或"'t"来指示制表符。但是,如果您有@"'n",它会告诉编译器"不,我真的想将反斜杠视为反斜杠字符,而不是转义序列。"

如果你不喜欢文字模式,方法是在你想要单个反斜杠的地方使用"''",因为编译器知道将转义的反斜杠视为单个字符。

在任何一种情况下,@"'n""''n"都会在内存中产生一个2个字符的字符串,其中包含字符'''和'n'。你走哪条路去都没关系;这两种方式都是告诉编译器你想要那两个字符。

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

如果您正在寻找一种方法来消除变量中出现的'',您只需想要String.Replace:

string ugly = @"C:''foo";
ugly = ugly.Replace(@"''", @"'");

第一个和第三个是实际路径,因此可以使用

Second甚至不能编译,如果

 string path = @"c:'test";
 File.Delete(path);