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

本文关键字:文件 进程 因为 另一个 访问 保存文件 | 更新日期: 2023-09-27 18:22:08

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

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

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

如果你查看MSDN,你会发现File.Create方法返回一个FileStream。

try..catch中,您正在使用File.Create创建一个文件,但FileStream处于挂起状态。

把它改成这样:

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

或呼叫CCD_ 4。

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

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

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

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

File.Create方法返回一个Stream(更具体地说是一个FileStream,该类型实现IDisposable。无论何时获得IDisposaable,都必须适当地处理它。由于您没有处理File.Change返回的对象,因此会得到异常。

通常,在读取/写入文件时,可以使用File.ReadAllText和File.WriteAllText方法来实现您想要的内容,因为它们不返回IDisposable对象,所以在这方面更容易使用。

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

实际上你甚至不需要文件。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);
    }
}