我有一个列表,我尝试使用File.WriteAllLines()
写入文件。列表中的一个字符串来自richTextBox
,因此对于新行包含\n
。但writeAllLines
似乎将其解释为在新行上写,就好像它是字符串列表中的单独项一样。我已经检查了我的代码,并且可以看到字符串在分割之前使其最终写入代码的所有行部分。我也尝试在字符串中使用'@'
符号,但也没有用。
有谁知道如何使writeAllLines
忽略转义序列?
答案 0 :(得分:1)
我假设您希望文件中的每个条目都在一行上。所以问题是你写入文件的一个或多个字符串包含换行符,除了WriteAllLines写出的换行符外,还会写入文件。
唯一的出路是你以编程方式逃避WriteAllLines'的换行符。输入数据。对每个可能包含换行符的值执行此操作。
string escapedValue = originalValue.Replace("\r", "\\r").Replace("\n", "\\n");
在文件中回读时,您需要浏览每一行。
string unescapedValue = escapedValue.Replace("\\r", "\r").Replace("\\n", "\n");
请注意:代码示例并不完美。如果原始字符串包含反斜杠后跟' r'或者' n',unescape逻辑会将它们转换为换行符。你可能不得不逃避' \'字符以及避免这种情况。
答案 1 :(得分:1)
来自\n
的文本中的richTextBox
不是转义序列,它是一个实际的<LF>
字符。它可能在调试器中看起来像\n
,但字符串在相应位置包含一个字符。
想象一下,您需要将一个以逗号分隔的字符串列表写入文件,其中一个字符串包含逗号:
"quick,brown", "fox", "jumps"
该清单将按如下方式写出
quick,brown,fox,jumps
并且无法找出字符串中的逗号。
您可以在编写文件时将\n
替换为其他字符,然后在阅读时将其替换回来解决此问题。
// Writing
File.WriteAllLines(@"c:\lines.txt", lines.Select(s => s.Replace('\n', '~')));
// Reading back
var lines = File.ReadAllLines(@"c:\lines.txt")
.Select(s => s.Replace('~', '\n')))
.ToArray();
请注意,您选择的字符不得出现在字符串中的任何其他位置。
答案 2 :(得分:0)
鉴于此清单:
var lines = new List<string>(3) {
"Here's a line",
"Line \n with a newline character", // \n here is a newline character
"Line with a \r character" // \r here is a carriage return character
};
要使您的文本文件如下所示:
Here's a line Line \n with a newline character Line with a \r character
你会想做这样的事情:
var escapedLines = lines.Select(l => l.Replace("\n", "\\n").Replace("\r", "\\r")).ToList();
File.WriteAllLines("file.txt", escapedLines);