我收到錯誤後:解決例外文件關閉的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.
我的程序刷新,關閉,並配置日誌文件。我的程序稍後嘗試打開文件以追加更多數據。第二次打開導致上述例外。
Process Explorer
不顯示文件的處理,執行過程中,可以直接訪問的二進制文件或與微軟的Visual C#快遞2008年
沒有其他進程調試模式下運行應該使用此文件,因爲它是我的應用程序創建的原始文件。
Stack Overflow中的某些解決方案建議實施using
語句,但這不可行,因爲數據的寫入不會發生在簡單或短的複合語句中。日誌記錄類使用編寫器委託將數據寫入文件。
根據堆棧溢出其他的解決方案,在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;
因爲我有一個最後期限,以滿足,我正在尋找解決方法,此問題。我的一些想法是:
- 保持文件的打開;在測試運行期間不要打開和關閉 。
- 顯示「等待文件」消息 給用戶,同時輪詢的文件( 看時它可以被再次打開)
- 寫一個非託管C或C++ 庫來處理該文件I/O (自非託管C和C++不使用 的.NET框架)。
- 學習如何告訴.NET框架 快點並關閉 文件。
我在Windows 7,64位體系結構上使用MS Visual C#2008 Express。
你爲什麼寫自己的日誌?你可以使用一個框架,如log4net來寫這個日誌嗎?因爲我可以很快給你答案。 – 2011-05-02 20:46:11
可以將FileShare.None更改爲FileShare.ReadWrite嗎? – DarkSquirrel42 2011-05-02 20:50:33
如果不使用「使用」,應始終使用try-finally來確保始終調用Dispose。第一次測試可能會在刷新和處理之間失敗? – 2011-05-02 20:51:24