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中!

如果有人能帮我解决这个问题,或者能给我指出一个更简单的方法,我将非常感激。

感谢马克

c#异常-文件不能被访问,因为它正在被另一个进程使用

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

问题是文件资源-从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:

checklistFileStart.Close ();

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