我该如何保存这个文件?

Rav*_*tar 0 c# notepad file save savefiledialog

所以我正在创建一个C#记事本,我差不多完成了,但是这是最后一个问题:我无法保存文件.当我打开一个文件,修改它并尝试保存它时,它会给我一个错误,说明该文件已被进程使用.我相信这个过程是由我的开放文件方法启动的,但我不确定.我有一个方法来保存打开一个保存文件对话框,但我想要一个不需要对话,只是一个快速 CNTRLŇ保存它,你可能会明白我的意思.

我的打开文件方法

 private void openItem_Click(object sender, EventArgs e)
    {
        Stream myStream;
        OpenFileDialog openFileDialog1 = new OpenFileDialog();

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if ((myStream = openFileDialog1.OpenFile()) != null)
            {
                string srtfilename = openFileDialog1.FileName;
                string filetext = File.ReadAllText(srtfilename);
                GetRichTextBox().Text = filetext;

                tabControl1.SelectedTab.Text = Path.GetFileName(openFileDialog1.FileName);

                GlobalPath = openFileDialog1.FileName;
            }

            openFileDialog1.Dispose();
        }
Run Code Online (Sandbox Code Playgroud)

我的保存文件方法WITH对话框,这个工作,但如果我选择我已经使用的文件,它会崩溃.

 private void saveAsItem_Click(object sender, EventArgs e)
    {
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            using (Stream s = File.Open(saveFileDialog1.FileName, FileMode.Create))
            using (StreamWriter sw = new StreamWriter(s))
            { sw.Write(GetRichTextBox().Text); }

            tabControl1.SelectedTab.Text = Path.GetFileName(saveFileDialog1.FileName);

            saveFileDialog1.Dispose();
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的快速保存文件方法,我有问题.这是我到目前为止所尝试的.

 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
    {
        string texto, nome, local;
        nome = tabControl1.SelectedTab.Text;
        texto = GetRichTextBox().Text;
        tabControl1.TabPages.Remove(tabControl1.SelectedTab);
        NewText();
        GetRichTextBox().Text = texto;
        tabControl1.SelectedTab.Text = nome;

        local = nome + ".txt";

        using (StreamWriter sw = new StreamWriter(GlobalPath, true))
        { sw.Write(texto); }

     // tabControl1.SelectedTab.Text = Path.GetFileName(saveFileDialog1.FileName);
    }
Run Code Online (Sandbox Code Playgroud)

Blo*_*ard 5

打开和读取文件的方法过于复杂,我认为这是问题的根源.你要留下一个Stream未被处置的物体.任何实现的东西都IDisposable应该包含在using声明中或明确处理.

这是打开文件方法的更好实现:

private void openItem_Click(object sender, EventArgs e)
{
    using (var openFileDialog1 = new OpenFileDialog())
    {
        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            try {
                string srtfilename = openFileDialog1.FileName;
                string filetext = File.ReadAllText(srtfilename);
                GetRichTextBox().Text = filetext;

                tabControl1.SelectedTab.Text = Path.GetFileName(openFileDialog1.FileName);

                GlobalPath = openFileDialog1.FileName;
            }
            catch (Exception ex) 
            {
                // you may wish to log the entire exception including stack trace here
                MessageBox.Show(ex.Message);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您不需要流来检查文件是否存在.现在,您不会留下任何可以保持文件打开的不受限制的资源.

您还可以使用if (File.Exists(strfilename))检查文件是否存在,或者只是不进行检查,因为如果文件不存在,FileOpenDialog将默认警告用户(我认为).

你应该坚持File.ReadAllTextFile.WriteAllText:没有必要Stream直接为一个简单的文本编辑器搞乱对象,它更干净,让你有更简单的代码.