![](/img/trans.png)
[英]The file cannot be accessed because it is being used by another process c#
[英]C# Exception - File cannot be accessed because it is being used by another process
我有一个Windows窗体应用程序,它使用2个窗体,同时写入单独的文件(通过在窗体上的文本框中包含字符串给出的文件路径)。
对于form1,我有许多函数可以通过各种不同的按钮点击将数据写入文件。 在这种情况下,我使用了StreamWriter consoleFile = new StreamWriter(File.OpenWrite(fileName));
第一次写入文件的方法和StreamWriter consoleFile = File.AppendText(fileName);
任何后续的。 这很好。
在为Form2实现相同功能时,主要区别在于所有文本都是一次写入的(一个函数包含四个子函数,以尝试保持代码整洁)。 我这样做了......
public void writeChecklistToFile()
{
//open new file for writing
StreamWriter checklistFileStart = new StreamWriter(File.OpenWrite(getChecklistFile()));
checklistFileStart.WriteLine("Pre-Anaesthetic Checklist\n");
//sub-functions (one for each section of list)
//append tool used in separate functions
//StreamWriter checklistFile = File.AppendText(getChecklistFile());
writeAnimalDetails();
writeAnimalHistory();
writeAnimalExamination();
writeDrugsCheck();
}
然后每个子函数都包含上面显示的appendText变量:
public void writeAnimalDetails()
{
StreamWriter checklistFile = File.AppendText(getChecklistFile());
//...
}
每当我单击调用main函数的按钮时,它就会在第一个File.AppendText()方法上抛出异常。 它指出无法访问目标文件,因为它已在另一个进程中使用。
据推测,这必须是OpenWrite(),因为它在此之前没有被使用过,但是我不明白为什么当我的form2不在form1中时会出现这个错误!
如果有人能帮助我解决这个问题,或者可以指出我更方便的方法,我真的很感激。
谢谢
标记
将错误读取为“因为[文件仍然打开以供此处使用]进程,因此无法访问文件 ”。
问题是,该文件的资源-从File.OpenWrite
-没有被处理完毕正常和非托管的文件句柄,以一个排他锁,保持开放 。 当试图打开仍然打开的文件进行写入时,这又会导致异常。 使用using
语句来帮助进行生命周期管理, 如此处所述 。
在这种特殊情况下,我建议提供StreamWriter - 一次创建 - 作为需要写入它的函数的参数,然后在完成时将整个打开文件资源放在一端。 这确保了更明显的资源生命周期并避免了几次开闭操作。
public void writeChecklistToFile()
{
// Open file for writing once..
using (var checklistWriter = new StreamWriter(File.OpenWrite(getChecklistFile())))
{
// .. write everything to it, using the same Stream
checklistWriter.WriteLine("Pre-Anaesthetic Checklist\n");
writeAnimalDetails(checklistWriter);
writeAnimalHistory(checklistWriter);
writeAnimalExamination(checklistWriter);
writeDrugsCheck(checklistWriter);
}
// And the file is really closed here, thanks to using/Dispose
}
另见
我认为它以你的第一种形式工作的原因是你一次只能存在一个StreamWriter。 单击按钮,创建StreamWriter,函数结束,StreamWriter在下一次按钮单击调用函数之前自动关闭。
但是,使用第二种形式,您将在具有StreamWriter的主函数中使用StreamWriters调用子函数。 相当于你有多个StreamWriter试图同时打开文件,从而错误。
要解决此问题,您可以在writeChecklistToFile函数中调用WriteLine之后:
checklistFileStart.Close();
这将关闭您的第一个FileStream,并允许您的后续文件打开。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.