c#streamwriter“进程无法访问文件”错误,即使它已关闭并处理掉

时间:2016-10-05 17:03:35

标签: c# dispose streamwriter

我正在编写简单的文本编辑器并遇到了保存问题。所以我有2个代码用于保存,一个是使用按钮保存文件和另一个ctrl + s键盘快捷键,当使用按钮保存时一切正常,但是当我用快捷方式保存时我得到这个错误:

  

“进程无法访问文件,因为它被另一个进程使用”

这是按钮保存的代码:`

        saveFileDialog1.FileName = currentname;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {

            StreamWriter writer = new StreamWriter(saveFileDialog1.OpenFile());

            writer.WriteLine(richTextBox1.Text);

            writer.Dispose();
            writer.Close();

            //so i have tabs in my editor so user can switch between them.
            //and this is the only way i found which tab is opened now.
            for (int i = 0; i < labels.Count; i++)
            {
               //i created new class that holds some variables including "isUsed" 
               //and Label itself.
                if (labels[i].isUsed)
                {
                    labels[i].Text = Path.GetFileName(saveFileDialog1.FileName);
                    labels[i].setText(labels[i].Text);
                    labels[i].path = saveFileDialog1.FileName;
                    break;
                }
            }

        }`
上面的

脚本工作正常,但下面的脚本不能:

        public void save(){

        bool found = false;
       //that is class i made.
        AdvancedLabel label = new AdvancedLabel();

        //I hold all tabs in "Labels" List.
        for (int i = 0; i < labels.Count; i++)
        {
           //so if loop found the tab that is opened now...
            if (labels[i].isUsed)
            {
                label = labels[i];
                found = true;
                break;
             }
        }
        if (found)
        {
            try
            {

                label.label.Text.Remove(label.label.Text.Length - 1);

                //here i always get this error.
                StreamWriter writer = new StreamWriter(label.path);

                writer.WriteLine(richTextBox1.Text);
                label.setText(label.Text.Remove(label.Text.Length - 1));
                writer.Dispose();
                writer.Close();

            }
            catch (Exception e)
            {
                status.Text = "status: " + e.Message + ". Failed to save :(";

            }
        }
    }

以下是完整错误:

  

mscorlib.dll中出现未处理的“System.IO.IOException”类型异常

Additional information: The process cannot access the file 'C:\Users\nika\Desktop\dd.html' because it is being used by another process.

修改

谢谢你们所有人,因为据我所知,我应该使用“使用”声明,而这里是我想出来的:

enter image description here

我忘了提到我也在使用stramreader打开文件。我将其更改为“使用”语句,但同样的事情发生,即使我现在使用:File.appendalltext语句。这也有效,但只有我用按钮保存。

这是我如何改变它(文件开启者不是作家):`

          using (var sr = new StreamReader(openFileDialog1.FileName))
            {
                bool found = false;

                for (int i = 0; i < labels.Count; i++)
                {
                    if (labels[i].path == openFileDialog1.FileName)
                    {
                        found = true;

                        break;
                    }
                }
                if (!found)
                {

                    richTextBox1.Text = "";
                    richTextBox1.Text = sr.ReadToEnd();

                    spawnLabel();
                }
            }`

ps(听起来很愚蠢)

正如@GauravKP建议:

enter image description here

任何帮助将不胜感激!谢谢!

- 尼克

1 个答案:

答案 0 :(得分:0)

始终使用&#34;使用&#34;当你处理流对象时。

using (var stream = ...)
{
    /* code */

    stream.Close();
}

这就是文档所说的:

通常,当您使用IDisposable对象时,您应该在使用语句中声明并实例化它。 using语句以正确的方式调用对象上的Dispose方法

正确的方法是关键词。

因为即使我们调用Dispose,&#34; 总是存在不会释放非托管资源的危险,因为对象的使用者无法调用其Dispose方法。&# 34;