2011-08-10 18 views
7

我需要不斷讀取日誌文件以檢測某些模式。如何在不干擾日誌寫入器操作需要執行的文件操作的情況下這樣做?以不妨礙其他進程修改的方式讀取文件

除了寫日誌之外,日誌寫入器進程還會週期性地將文件移動到另一個位置(一個達到特定大小)。

隨着我讀取文件的方式,日誌記錄器應用程序無法移動文件。我玩了各種FileShare選項無濟於事。

這裏的簡化我的代碼版本:

using (FileStream stream = new FileStream(@"C:\temp\in.txt", FileMode.Open, FileAccess.Read, FileShare.Delete)) 
     { 
      TextReader tr = new StreamReader(stream); 
      while (true) 
      { 

       Console.WriteLine(".. " + tr.ReadLine()); 
       Thread.Sleep(1000); 
      } 

     } 
+0

「日誌寫入器應用程序無法移動文件」 - 您想讓讀者在正在移動的文件上保持打開狀態? –

+0

只要文件可用,我想繼續閱讀。我無法控制日誌記錄應用何時/如何移動文件。理想情況下,當文件被移動時,我會得到一個異常,並從這一點開始讀取新的日誌文件。 – akirekadu

回答

3

嘗試FileShare.ReadWrite | FileShare.Delete

但是,如果該文件被刪除(移動),那麼我認爲你的閱讀將失敗。

+0

謝謝。這正是我所期待的。 – akirekadu

3

您把文件打開所有的時間,不僅當有改變閱讀。

我認爲一個更好的方法是使用FileSystemWatcher來監視文件的更改,然後在更改和讀取新數據時打開文件。如果文件僅附加到文件,您可以跟蹤文件處理的時間,並在打開文件時立即找到該位置。

+0

如果這是一個適度(或重度)使用的日誌文件(我懷疑它可能),那麼這將不斷觸發。假設這個文件正在寫入1000行/秒... – Joe

+0

@anders然後他有同樣的問題,當讀者閱讀時,作者想要移動該文件。 – Skomski

+0

像喬提到的那樣,這是一個日誌文件,不斷更新。 – akirekadu