C# 如何保存此文件?

C# 如何保存此文件?,c#,file,save,notepad,savefiledialog,C#,File,Save,Notepad,Savefiledialog,所以我正在创建一个C#记事本,我几乎完成了,但还有最后一个问题: 我无法保存文件。当我打开一个文件,修改它,并试图保存它,它给我一个错误,说该文件已经在使用的进程。我相信这个过程是由我的openfile方法开始的,但我不确定。我确实有一个方法来保存打开一个保存文件对话框,但我想要一个不需要对话框的,只是一个快速的cntrl n来保存它,你可能理解我的意思 我的打开文件方法 private void openItem_Click(object sender, EventArgs e) {

所以我正在创建一个C#记事本,我几乎完成了,但还有最后一个问题: 我无法保存文件。当我打开一个文件,修改它,并试图保存它,它给我一个错误,说该文件已经在使用的进程。我相信这个过程是由我的openfile方法开始的,但我不确定。我确实有一个方法来保存打开一个保存文件对话框,但我想要一个不需要对话框的,只是一个快速的cntrl n来保存它,你可能理解我的意思

我的打开文件方法

 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();
        }
我的savefile方法是dialog,这个方法可以工作,但是如果我选择了我已经在使用的文件,它就会崩溃

 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();
        }
    }
我的快速保存文件的方法,我有一个问题。这就是我迄今为止所尝试的

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

您打开和读取文件的方法过于复杂,我认为这是您问题的根源。您将使
对象处于未处置状态。任何实现了
IDisposable
的东西都应该使用
语句包装在
中,或者显式地处理掉

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

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);
            }
        }
    }
}
您不需要流来检查文件是否存在。现在,您不会留下任何未经处理的资源来保持文件打开

您还可以使用
if(File.Exists(strfilename))
检查文件是否存在,或者干脆不进行检查,因为如果文件不存在,FileOpenDialog实际上会在默认情况下(我认为)警告用户


您应该坚持使用
File.ReadAllText
File.writealText
:对于一个简单的文本编辑器,不需要直接处理
对象,而且它更干净,留给您的代码也更简单。

您打开和读取文件的方法过于复杂,我认为这是你问题的根源。您将使
对象处于未处置状态。任何实现了
IDisposable
的东西都应该使用
语句包装在
中,或者显式地处理掉

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

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);
            }
        }
    }
}
您不需要流来检查文件是否存在。现在,您不会留下任何未经处理的资源来保持文件打开

您还可以使用
if(File.Exists(strfilename))
检查文件是否存在,或者干脆不进行检查,因为如果文件不存在,FileOpenDialog实际上会在默认情况下(我认为)警告用户


你应该坚持使用
File.ReadAllText
File.WriteAllText
:对于一个简单的文本编辑器,没有必要直接处理
对象,而且它更干净,代码也更简单。

你为什么不调试你的应用程序,看看抛出的异常?@Fang更容易在这里发问,我猜…@Fang抛出的异常没有告诉你所属进程是什么,只是其他人拥有该文件并自己去找它。诚然,如果你包含打开文件的流的上下文,解决方案仍然是可以发现的,但是仅仅异常是不够的。你为什么不调试你的应用程序,看看抛出的异常呢?@Fang在这里更容易发问,我猜…@Fang在这里抛出的异常没有告诉你所属进程是什么,只有其他人拥有这个文件,自己去找。诚然,如果包含使用流打开文件的上下文,解决方案仍然是可以发现的,但仅异常是不够的。我要补充的唯一一点是,
FileNotFoundException
远远不是可以从
file.ReadAllText()
抛出的唯一异常(请参阅详细列表)。每个异常类型都应该有多个catch块,每个catch块都显示一条唯一的消息,或者一个块捕获一个通用的
异常
,并显示任何
ex.Message
碰巧包含的内容。我要补充的唯一一点是
FileNotFoundException
远远不是唯一可以从
文件.ReadAllText()
抛出的异常(请参阅详细列表)。对于每个异常类型,应该有多个捕捉块,每个捕捉块都显示一条唯一的消息,或者一个捕捉通用的
异常
,并显示碰巧包含的任何
ex.message