我正在使用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);
}
}
答案 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.ReadAllText和File.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);
}
}