使用ReadAllLines()c#打开文本文件时会打破行

时间:2016-07-20 17:54:06

标签: c# notepad

我已经创建了一个程序来制作错误模板,并且遇到文本无法正确保存的问题。

我有一个名为TemplateTexts的文本文件,其中包含每个模板的所有文本,模板看起来像这样 -

REQUIREMENTS
- Example

ADDITIONAL REQUIREMENTS
- Example 
- Example
-----COPY BELOW THIS LINE-----

当程序关闭时,它会将所有内容复制到文本文件的一行。 (看起来像这样)

REQUIREMENTS- Example ADDITIONAL REQUIREMENTS- Example - Example-----COPY BELOW THIS LINE-----

文本文件包含20行模板。模板在文本文件中保存为1行文本,但是当我再次打开程序时,它会将1行文本转换为多行文本,就像在第一个示例中显示的那样。

知道为什么会这样吗?或者是否有更好的方法将每个模板保存到文本文件中,可能是用标志或其他东西分隔它?

这是我程序的代码:

public partial class Form1 : Form
{
    static String buttonNamesPath = AppDomain.CurrentDomain.BaseDirectory + "/ButtonNames.txt";
    String[] ButtonNames    = System.IO.File.ReadAllLines(buttonNamesPath);
    static String buttonTextPath = AppDomain.CurrentDomain.BaseDirectory + "/ButtonText.txt";
    String[] ButtonText     = System.IO.File.ReadAllLines(buttonTextPath);

    private void SetupTextField()
    {
        comboBox1.Items.Clear();
        comboBox2.Items.Clear();
        for (int i = 0; i < ButtonNames.Length; i++)
        {
            comboBox1.Items.Insert(i, ButtonNames[i]);
            comboBox2.Items.Insert(i, ButtonNames[i]);
        }
    }

    public Form1()
    {
        InitializeComponent();
        this.FormClosing += this.Form1_FormClosing;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        SetupTextField();
    }

    private void richTextBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        string comboBoxText;
        comboBoxText = comboBox1.SelectedItem.ToString();

        int strNumber;
        int strIndex = 0;
        for (strNumber = 0; strNumber < ButtonNames.Length; strNumber++)
        {
            strIndex = Array.FindIndex(ButtonNames, x => x.Contains(comboBoxText)); 
            if (strIndex >= 0)
                break;
        }

        ButtonNames[strIndex] = textBox1.Text;
        ButtonText[strIndex] = richTextBox2.Text;
        SetupTextField();
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        System.IO.File.WriteAllLines(buttonNamesPath, ButtonNames);
        System.IO.File.WriteAllLines(buttonTextPath, ButtonText);
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {

    }

    private void label1_Click(object sender, EventArgs e)
    {

    }

    private void button3_Click(object sender, EventArgs e)
    {
        richTextBox1.Text = "";
    }

    private void button2_Click(object sender, EventArgs e)
    {

        string comboBoxText;
        comboBoxText = comboBox2.SelectedItem.ToString();

        int strNumber;
        int strIndex = 0;
        for (strNumber = 0; strNumber < ButtonNames.Length; strNumber++)
        {
            strIndex = Array.FindIndex(ButtonNames, x => x.Contains(comboBoxText));
            if (strIndex >= 0)
                break;
        }


        richTextBox1.Text = ButtonText[strIndex];
    }

    private void label3_Click(object sender, EventArgs e)
    {

    }
}

我还有2个名为ButtonNames.txt和ButtonText.txt的文本文件

1 个答案:

答案 0 :(得分:2)

当您向RichTextBox询问其Text属性时,它会将其内部包含的富文本转换为纯文本字符串,并且显然默认使用\n来翻译行结局。记事本无法将\n识别为行尾(因为它正在查找\r\n的官方Windows行结尾),因此它会在一行中显示所有内容。如果您希望使用\r\n保存行结尾,请对string.Replace的结果使用RichTextBox.Text,将\n替换为\r\n

有关详细信息,请参阅此问题及其答案:

RichTextBox Newline Conversion?