2016-03-23 14 views
1

Ich habe eine Liste, die ich versuche, in eine Datei schreiben mit File.WriteAllLines(). Eine der Zeichenfolgen in der Liste stammt von einer richTextBox und enthält daher \n für neue Zeilen. Aber writeAllLines scheint das so zu interpretieren, als würde man auf eine neue Zeile schreiben, als wäre es ein separates Element in der String-Liste. Ich habe meinen Code inspiziert und kann sehen, dass der String es zum endgültigen Schreiben aller Zeilen Teil meines Codes vor der Aufteilung macht. Ich habe auch versucht, das Zeichen '@' in der Zeichenfolge zu verwenden, und das hat auch nicht funktioniert.C# File.WriteAllLines neue Zeile Backslash

Weiß jemand wie man writeAllLines Escape-Sequenzen zu ignorieren?

+2

'WriteAllLines' * * ignoriert Escape-Sequenzen. Ich bin mir ziemlich sicher, dass deine Zeile * wirklich * einen Zeilenumbruch enthält, der im Debugger als '\ n' angezeigt werden kann. – Heinzi

Antwort

1

Ich nehme an, dass jeder Eintrag in der Datei in einer Zeile stehen soll. Das Problem besteht also darin, dass eine oder mehrere der Zeichenfolgen, die Sie in die Datei schreiben, Zeilenumbrüche enthalten, die zusätzlich zu den Zeilenumbrüchen, die WriteAllLines ausgibt, in die Datei geschrieben werden.

Der einzige Ausweg ist, dass Sie die Zeilenumbrüche von WriteAlllines Input-Daten programmgesteuert entkommen lassen. Tun Sie dies für jeden Wert, der Zeilenumbrüche enthalten könnte.

string escapedValue = originalValue.Replace("\r", "\\r").Replace("\n", "\\n"); 

Wenn Sie in der Datei zurücklesen, müssen Sie jede Zeile unleserlich machen.

string unescapedValue = escapedValue.Replace("\\r", "\r").Replace("\\n", "\n"); 

Bitte beachten Sie: Das Codebeispiel ist nicht perfekt. Wenn die ursprünglichen Zeichenfolgen Backslashes gefolgt von 'r' oder 'n' enthalten, konvertiert die Unescape-Logik sie in Zeilenumbrüche. Sie müssen wahrscheinlich auch '\' Zeichen entkommen, um dies zu vermeiden.

+0

Danke, das hat das Problem behoben! – aljowen

+0

Loading = content.Replace ("\\ n", "\ n"). Ersetzen ("\\ r", "\ r"). Ersetzen ("~", "\\"); – aljowen

+0

Speichern = content.Replace ("\\", "~"). Ersetzen ("\ n", "\\ n"). Ersetzen ("\ r", "\\ r")); – aljowen

1

Die \n im Text von richTextBox ist nicht eine Escape-Sequenz, es ist ein tatsächlicher <LF> Charakter. Es kann wie \n im Debugger aussehen, aber die Zeichenfolge enthält ein einzelnes Zeichen an der entsprechenden Position.

Stellen Sie sich vor, dass Sie eine durch Kommata getrennte Liste von Zeichenketten in einer Datei zu schreiben, und eine der Saiten enthält ein Komma:

"quick,brown", "fox", "jumps" 

Die Liste geschrieben werden würde als

quick,brown,fox,jumps 
folgt

und es gibt keine Möglichkeit herauszufinden, welches Komma aus einer Zeichenfolge stammt.

Sie können das Problem umgehen, indem Sie beim Schreiben der Datei \n durch ein anderes Zeichen ersetzen und dann beim Lesen wieder ersetzen.

// 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(); 

Beachten Sie, dass das Zeichen, das Sie nirgendwo sonst in der Zeichenfolge vorhanden sein wählen müssen.

0

Angesichts dieser Liste:

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 
}; 

Um die Textdatei zu erhalten wie folgt zu lesen:

Here's a line 
Line \n with a newline character 
Line with a \r character 

Sie würden wollen, um so etwas zu tun:

var escapedLines = lines.Select(l => l.Replace("\n", "\\n").Replace("\r", "\\r")).ToList(); 
File.WriteAllLines("file.txt", escapedLines);