[英]Resolving exception file in use after closing StreamWriter
我收到错误消息:
The process cannot access the file
'C:\AMR_VOYANT_TESTING\PWM_TESTER\UUT_LOGS\TEST_LOG_PWM_10245_UUT_SN_10.TXT'
because it is being used by another process.
我的程序刷新、关闭和处理日志文件。 我的程序稍后尝试打开文件到 append 更多数据。 第二次打开导致上述异常。
Process Explorer
不显示文件的句柄,在执行期间直接访问二进制文件或使用 MS Visual C# Express 2008 在调试模式下运行。
其他进程不应使用此文件,因为它是我的应用程序创建的原始文件。
Stack Overflow 中的一些解决方案建议实现using
语句,但这不可行,因为数据的写入不会发生在简单或简短的复合语句中。 记录 class 使用写入器委托将数据写入文件。
根据 Stack Overflow 中的其他解决方案,在for
循环中,在打开文件的下一次迭代之前可能不会关闭文件。 在再次打开文件之前,我已经等待了 10 多秒,但无济于事(同样的例外)。
这是代码示例:
public void
close()
{
get_log_file().WriteLine("");
get_log_file().Flush();
get_log_file().Close();
get_log_file().Dispose();
m_log_file = null;
return;
}
private StreamWriter
get_log_file()
{
if (m_log_file == null)
{
bool successful = false;
int retries_remaining = 5;
// do
// {
// try
// {
// m_log_file = new StreamWriter(m_filename, true);
m_log_file = new StreamWriter(new FileStream(m_filename, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None));
// }
// catch (IOException)
// {
// --retries_remaining;
// System.Threading.Thread.Sleep(250); // Units are in milliseconds;
// }
// } while (!successful && (retries_remaining >= 0));
}
return m_log_file;
}
private System.IO.StreamWriter m_log_file = null;
private string m_filename;
由于我有一个截止日期,我正在寻找这个问题的解决方案。 我的一些想法是:
我在 Windows 7、64 位架构上使用 MS Visual C# 2008 Express。
我希望为您提供一个快速解决方案是将FileMode.OpenorCreate
替换为FileMode.Append
;
正如其他人所指出的那样,还有无数其他的日志记录选项,但我相信这可能会为您提供从您所在位置快速前进的方法,而不是倒退前进。
在我看来,您的代码是 class 的片段,它将流写入器返回到调用上下文。 我会让您的 class 实现 IDisposable 将您的关闭更改为 Dispose(以实现 IDisposable),然后让您的消费者将调用包装到 using(yourLogClass logger = new yourLogClass())... 等以确保调用关闭每次使用。
在此 class 中调用方法的代码在调用 open 方法后不会调用您的 close() 方法。 根据您发布的代码,我假设有一个单独的 open 方法。 如果该方法被多次调用,那么您将得到您所描述的异常。 您发布的代码没有会导致您遇到异常的问题。 如果在调用 Close() 之前调用 Flush(),它将强制写入磁盘,以便在调用 Close() 时没有延迟有这个问题。
更新:如果您的代码在调试时抛出异常,VS 仍然对该文件有一个打开的句柄。 即使您更正了代码,它也会继续抛出该异常。 我通常只是关闭并重新启动 VS,以免弄乱我的项目设置并意外将它们检入源代码管理。
我通过保持文件打开解决了这个问题,这消除了每次重新打开它的需要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.