2011-05-02 37 views
0

我收到錯誤後:解決例外文件關閉的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; 

因爲我有一個最後期限,以滿足,我正在尋找解決方法,此問題。我的一些想法是:

  1. 保持文件的打開;在測試運行期間不要打開和關閉 。
  2. 顯示「等待文件」消息 給用戶,同時輪詢的文件( 看時它可以被再次打開)
  3. 寫一個非託管C或C++ 庫來處理該文件I/O (自非託管C和C++不使用 的.NET框架)。
  4. 學習如何告訴.NET框架 快點並關閉 文件。

我在Windows 7,64位體系結構上使用MS Visual C#2008 Express。

+0

你爲什麼寫自己的日誌?你可以使用一個框架,如log4net來寫這個日誌嗎?因爲我可以很快給你答案。 – 2011-05-02 20:46:11

+0

可以將FileShare.None更改爲FileShare.ReadWrite嗎? – DarkSquirrel42 2011-05-02 20:50:33

+1

如果不使用「使用」,應始終使用try-finally來確保始終調用Dispose。第一次測試可能會在刷新和處理之間失敗? – 2011-05-02 20:51:24

回答

0

我通過保持打開的文件解決了這個問題,每次都不需要重新打開文件。

0
  1. 如果你想做的正確,你必須花一些時間。或
  2. 使用tracinglogging框架。
  3. 我猜你是與Visual Studio宿主進程調試。嘗試禁用它,並檢查文件鎖定問題是否消失。

禁用的

Project - Properties - Debug - x Enable Visual Studio hosting process 

的複選框,這也可能是你在你的終結之一期間應用程序關閉跟蹤,其中StreaWriter已經關閉。您可以通過使用一個Critical Finalizer

此致解決這個問題, 阿洛伊斯·克勞斯

0

我希望會爲您提供一個快速的解決方案是FileMode.Append更換FileMode.OpenorCreate;

正如其他人所指出的那樣,還有其他各種日誌選項,但我相信這可能會爲您提供一個從您站立的位置快速前進的途徑,而不是後退前進。

它在我看來是你的代碼是一個類的片段,它將streamwriter返回到調用上下文。我會讓你的類實現IDisposable改變你接近Dispose(來實現IDisposable),然後讓你的消費者將調用包裝成一個using(yourLogClass logger = new yourClass())...等等,以確保關閉被調用每次使用。

0

調用此類中的方法的代碼在調用open方法後不會調用close()方法。根據你發佈的代碼,我假設有一個單獨的開放方法。如果該方法被多次調用,那麼您將得到您所描述的異常。你發佈的代碼沒有問題,會導致你得到的異常。如果你在調用Close()之前調用Flush(),它會強制寫入磁盤,這樣當你調用Close()時,不會有任何延遲。我通過在一兩秒內打開和關閉數百次文件來敲擊文件,有這個問題。

更新:如果你的代碼在你調試的時候拋出一個異常,那麼VS在這個文件上仍然有一個打開的句柄。即使您更正了代碼,它仍將繼續拋出該異常。我通常只是關閉並重新啓動VS,以免弄亂我的項目設置並意外將它們檢入源代碼控制。

+0

此外,該類正在保持非託管資源,其中計算機上的數量有限。你需要實現IDisposable和Finalizer。 http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx – 2011-05-03 04:37:57