正在保存文件:进程无法访问该文件,因为另一个进程正在使用该文件
本文关键字:文件 进程 因为 另一个 访问 保存文件 | 更新日期: 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);
}
}