C#异常 - 无法访问文件,因为另一个进程

时间:2015-08-01 10:43:40

标签: c# writetofile

我有一个使用2个表单的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中我的form2中会出现这个错误!

如果有人能帮助我解决这个问题,或者可以指出我更方便的方法,我真的很感激。

由于

标记

2 个答案:

答案 0 :(得分:6)

读取错误"无法访问文件,因为 [文件仍然可供此处使用]进程"。

问题是文件资源 - 来自File.OpenWrite - 不正确Disposed非托管文件句柄,具有独占锁定,保持打开。当试图打开仍然打开的文件进行写入时,这又会导致异常。使用the using statement来帮助完成生命周期管理as discussed here

在这种特殊情况下,我建议提供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
}

另见

答案 1 :(得分:2)

我认为它在您的第一种形式中起作用的原因是您一次只能存在一个StreamWriter。单击按钮,创建StreamWriter,函数结束,StreamWriter在下一次按钮单击调用函数之前自动关闭。

但是,使用第二种形式,您将使用StreamWriters在具有StreamWriter的主函数中调用子函数。相当于你有多个StreamWriter试图同时打开文件,从而导致错误。

要解决此问题,您可以在writeChecklistToFile函数中调用WriteLine之后放置:
    checklistFileStart.Close();

这将关闭你的第一个FileStream,并允许你的后续文件打开。