文件正被另一个进程使用。 理由和解决方案?

该进程无法访问文件’abc.log’,因为它正由另一个进程使用。

嗨,我从我的应用程序中看到了这个exception,但我仍在努力解决这个问题,希望我能从stackoverflow中获得一些见解。

在我的应用程序中,我已经定义了一个写入日志文件的WriteToLog函数。 我的应用程序的mainForm也将启动backgroundWorker做一些也调用WriteToLog的工作。 也许两个线程访问文件会导致问题? 但在我的代码中,我已经尽力编写flush并关闭文本文件(我认为),这是我的WriteToLog代码:

StreamWriter sw = null; string newText = ""; try { //populate the content for newText sw = File.AppendText(LOG_FILE); sw.Write(newText); sw.Flush(); sw.Close(); } catch (IOException ex) { MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { if (sw != null) { sw.Close(); } } 

我想只要我刷新并关闭streamWriter,我应该能够多次调用WriteToLog并且在multithreading中不是吗? 或者,如果我错了,我可以简单地将文件打开共享,还是有其他原因/解决方案?

没有; 尝试同时打开文件的不同线程会相互干扰。 您可以lock共享object以强制线程一次运行一个。

或者只使用内置的.NET跟踪function ; 您可以配置app.config以写入文件。

这可能与您的问题无关,但您可以通过在StreamWriter using语句而不是使用finally来简化此代码。 这还有一个额外的好处,就是不必显式调用CloseFlush (关闭流也会刷新它)。

我没有尝试编译它,但它应该是这样的:

 string newText = ""; try { //populate the content for newText using (StreamWriter sw = File.AppendText(LOG_FILE)) { sw.Write(newText); } } catch (IOException ex) { MessageBox.Show("Failed to write to log!\n\t" + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } 

如果从多个线程调用此方法,则必须确保文件操作是primefaces操作。 线程A很可能越过AppendText并在例如Write上停止,此时线程B被调度并开始写入相同(现在已锁定)的文件。

处理此问题的一种方法是在代码示例中显示的语句周围放置一个锁定区域。