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());
//...
}
每当我单击调用主函数的按钮时,它都会在第一个 File.AppendText() 方法上抛出异常。它声明无法访问目标文件,因为它已在另一个进程中使用。
大概这必须是 OpenWrite(),因为它之前没有在任何地方使用过,但我不明白为什么这个错误会出现在我的 form2 中,而它不会出现在 form1 中!
如果有人可以帮助我解决这个问题,或者可以指出更简单的方法,我将不胜感激。
谢谢
马克
读取错误为"File cannot be accessed because [the file is still open for use by this] process"。
问题是文件资源 - 来自 File.OpenWrite
- 不是 Disposed correctly and an unmanaged file handle, with an exclusive lock, is kept open. This in turn results in exceptions when trying to open the still-open file for writing. Use the using
statement to help with lifetime management, 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
}
另见
- File cannot be accessed because it is being used by another program
我认为它在您的第一种形式中起作用的原因是您一次只能有一个 StreamWriter。您单击一个按钮,创建一个 StreamWriter,该函数结束,并且 StreamWriter 在下一个按钮单击调用函数之前自动关闭。
但是,对于第二种形式,您是在主函数中使用 StreamWriters 调用子函数,该主函数也具有 StreamWriter。这相当于您有多个 StreamWriter 试图同时打开文件,因此出现错误。
要解决此问题,您可以在 writeChecklistToFile 函数中调用 WriteLine 之后:
checklistFileStart.Close();
这将关闭您的第一个 FileStream,并允许您的后续文件打开该文件。
我有一个 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());
//...
}
每当我单击调用主函数的按钮时,它都会在第一个 File.AppendText() 方法上抛出异常。它声明无法访问目标文件,因为它已在另一个进程中使用。
大概这必须是 OpenWrite(),因为它之前没有在任何地方使用过,但我不明白为什么这个错误会出现在我的 form2 中,而它不会出现在 form1 中!
如果有人可以帮助我解决这个问题,或者可以指出更简单的方法,我将不胜感激。
谢谢
马克
读取错误为"File cannot be accessed because [the file is still open for use by this] process"。
问题是文件资源 - 来自 File.OpenWrite
- 不是 Disposed correctly and an unmanaged file handle, with an exclusive lock, is kept open. This in turn results in exceptions when trying to open the still-open file for writing. Use the using
statement to help with lifetime management, 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
}
另见
- File cannot be accessed because it is being used by another program
我认为它在您的第一种形式中起作用的原因是您一次只能有一个 StreamWriter。您单击一个按钮,创建一个 StreamWriter,该函数结束,并且 StreamWriter 在下一个按钮单击调用函数之前自动关闭。
但是,对于第二种形式,您是在主函数中使用 StreamWriters 调用子函数,该主函数也具有 StreamWriter。这相当于您有多个 StreamWriter 试图同时打开文件,因此出现错误。
要解决此问题,您可以在 writeChecklistToFile 函数中调用 WriteLine 之后:
checklistFileStart.Close();
这将关闭您的第一个 FileStream,并允许您的后续文件打开该文件。