0

我正在使用 VS2012 和 Windows 8 创建一个简单的 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);

        }
    }
4

3 回答 3

4

如果您查看 MSDN,您会看到File.Create 方法返回一个 FileStream

在您的中,您正在使用但保留挂起try..catch的文件创建文件。File.CreateFileStream

把它改成这样:

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

.. 或打电话Close()

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

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

于 2013-07-13T12:26:32.873 回答
0

File.Create方法返回一个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);
    }
}
于 2013-07-13T12:56:19.490 回答
0
FileStream fs = System.IO.File.Create("D:\\MyNotes\\MyNotes.rtf");
fs.Close();

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

于 2013-07-13T12:29:30.567 回答