C#异常 - 无法访问文件,因为它正由另一个进程使用

mar*_*thh 2 c# writetofile

我有一个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();
    }
Run Code Online (Sandbox Code Playgroud)

然后每个子函数都包含上面显示的appendText变量:

    public void writeAnimalDetails()
    {
        StreamWriter checklistFile = File.AppendText(getChecklistFile());

        //...
    }
Run Code Online (Sandbox Code Playgroud)

每当我单击调用main函数的按钮时,它就会在第一个File.AppendText()方法上抛出异常.它指出无法访问目标文件,因为它已在另一个进程中使用.

据推测,这必须是OpenWrite(),因为它在此之前没有被使用过,但是我不明白为什么当我的form2不在form1中时会出现这个错误!

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

谢谢

标记

use*_*740 6

将错误读取为"因为[文件仍然打开以供此处使用]进程,因此无法访问文件 ".

问题是,该文件的资源-从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
}
Run Code Online (Sandbox Code Playgroud)

另见