保存文件:进程无法访问该文件,因为它正由另一个进程使用

时间:2013-07-13 12:21:57

标签: c#

我正在使用VS2012和Windows 8创建一个简单的Windows应用程序。 有一个富文本框,用户应在其中输入文本,当表单关闭时,它应该将richtextbox的文本保存在文件中。但是,几乎总是应用程序抛出错误,说文件是“进程无法访问该文件,因为它正被另一个进程使用” 代码如下

 public Form1()
    {
        InitializeComponent();

        try
        {
            richTextBox1.LoadFile("D:\\MyNotes\\MyNotes.rtf");
        }
        catch (Exception ex)
        {

            System.IO.File.Create("D:\\MyNotes\\MyNotes.rtf");
        }
    }
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {


        try
        {

            System.IO.StreamWriter SW = new System.IO.StreamWriter(
            "D:\\MyNotes\\MyNotes.rtf", false, Encoding.ASCII);
            SW.Write(richTextBox1.Text);
            SW.Close();

                            //Even this does not work
            // richTextBox1.SaveFile("D:\\MyNotes\\MyNotes.rtf");


        }
        catch (Exception ex)
        {


            MessageBox.Show(ex.Message);

        }
    }

3 个答案:

答案 0 :(得分:4)

如果查看MSDN,您会看到File.Create method returns a FileStream

try..catch中,您正在使用File.Create创建文件,但FileStream仍悬空。

将其更改为:

if (!File.Exists("D:\\MyNotes\\MyNotes.rtf")) {
    using (var stream = File.Create("D:\\MyNotes\\MyNotes.rtf")) {
        // nop
    }
}

..或致电Close()

这解释了“几乎总是”..因为当你再次运行它时,文件就会被创建而且块也不会运行。

您可以考虑不创建该文件。

答案 1 :(得分:0)

FileStream fs = System.IO.File.Create("D:\\MyNotes\\MyNotes.rtf");
fs.Close();

System.IO.File.Create()让你的文件一直打开。

答案 2 :(得分:0)

File.Create Method会返回Stream(更具体地说是FileStream,该类型会实现IDisposable。每当您获得IDisposable时,您必须妥善处理它由于你没有处理File.Create返回的对象,你得到了例外。

通常在阅读/编写文件时,您可以使用方法File.ReadAllTextFile.WriteAllText来实现您想要的功能,因为它们不会返回IDisposable对象,因此更容易使用这些方法。

在你的情况下,我认为没有理由使用返回IDisposable对象的方法,只需使用File.ReadAllText和File.WriteAllText。以另一种方式解释:您不需要流,您只需要读/写文本。

实际上你甚至不需要File.ReadAllText:

public class Form1
{
    private const string fileName = @"D:\MyNotes\MyNotes.rtf";

    public Form1()
    {
        InitializeComponent();

        if (!File.Exists(fileName))
            File.WriteAllText(fileName, "");

        richTextBox1.LoadFile(fileName);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        richTextBox1.SaveFile(fileName);
    }
}