c#File.WriteAllLines新行反斜杠

时间:2016-03-23 20:55:55

标签: c# .net

我有一个列表,我尝试使用File.WriteAllLines()写入文件。列表中的一个字符串来自richTextBox,因此对于新行包含\n。但writeAllLines似乎将其解释为在新行上写,就好像它是字符串列表中的单独项一样。我已经检查了我的代码,并且可以看到字符串在分割之前使其最终写入代码的所有行部分。我也尝试在字符串中使用'@'符号,但也没有用。

有谁知道如何使writeAllLines忽略转义序列?

3 个答案:

答案 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);