c#异常-文件不能被访问,因为它正在被另一个进程使用
本文关键字:另一个 进程 异常 文件 不能 访问 因为 | 更新日期: 2023-09-27 18:05:47
我有一个Windows窗体应用程序,它使用两个窗体,两个窗体都写单独的文件(文件路径由窗体上的文本框中包含字符串给出)。
对于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的主函数中调用带有StreamWriter的子函数。这相当于你有多个StreamWriter试图同时打开文件,因此出现错误。要解决这个问题,您可以在writeChecklistToFile函数中调用WriteLine:
这将关闭您的第一个FileStream,并允许您的后续文件打开文件