2011-05-25 48 views
7

我創建一個跟蹤偵聽這樣的:.NET - TextWriterTraceListener會,文件被另一個進程使用

// Setup log tracing. 

Trace.Listeners.Add(new TextWriterTraceListener(MyLogPath)); 
Trace.AutoFlush = true; 
Trace.WriteLine(DateTime.Now.ToString() + "-" + " Program started"); 

當我發現該文件已得到太大,我想截斷它(或相反,只有最後N行)。爲了做到這一點,我想讀取文件,但似乎沒有任何問題,我做跟蹤監聽器有一個鎖,即試圖刪除跟蹤監聽器,並像這樣處理其流:

// Clear logging. 

Trace.Listeners[0].Close(); 
Trace.Listeners[0].Dispose();      
Trace.Listeners.Clear(); 

,之前在閱讀這樣的:

// Read in existing log. 

string[] lines = File.ReadAllLines(MyLogPath); 

,給了我一個IO異常(文件正在由另一個進程使用)。

有什麼想法?

回答

4

那麼,一旦TraceWriter打開文件就無法重新打開文件的原因是,它以「讀取」(每個進程監視器)的共享模式打開它。這種共享模式意味着你不能用寫入權限重新打開它(創建一個新的句柄)。

但是,關閉TraceListener 確實關閉了基礎流。問題很可能是你關閉了錯誤的監聽器。

不要忘記,在進程啓動時總是會創建一個DefaultTraceListener,除非您明確將其刪除。

所以你的代碼的正確版本應該是:

Trace.Listeners[1].Close(); 
Trace.Listeners[1].Dispose(); 
Trace.Listeners.Clear(); 
+0

啊!是的,我在檢查收集後才發現這一點。這工作。 – Robinson 2011-05-25 17:16:43

相關問題