2011-09-08 50 views
1

我保留了幾個文本日誌文件,以防止它們變得太大。我搜索並發現了很多人問同樣的事情,我發現了幾個解決方案,看起來效率是有問題的,所以我試着滾動我自己的功能。我以前在VB6中做過同樣的事情,並最終在我的所有應用程序中使用該函數,所以我知道我現在會經常在我的C#程序中使用它。這應該可能是CW,但因爲CW標記爲禁用問題,所以我在這裏發佈。我的問題是,因爲我將會使用它很多是有效的,如果不是,我應該改變什麼來改進它?目前我將日誌文件限制爲1MB,這是我保留的最大日誌,所以我不認爲它們會有更大的變化。保留特定大小的日誌文件

private static void ShrinkFile(string file) 
{ 
    StreamReader sr = new StreamReader(file); 
    for (int i = 0; i < 9; i++) // throw away the first 10 lines 
    { 
     sr.ReadLine(); 
    } 
    string remainingContents = sr.ReadToEnd(); 
    sr.Close(); 
    File.WriteAllText(file, remainingContents); 
} 
+6

爲什麼不使用log4net登錄?您的案例在這個組件中處理得很好 – Seb

+0

ShrinkFile如何調用?你使用FileWatcher類來觸發它嗎? – JimSTAT

+0

在我看來,sr.ReadToEnd()在將整個文件讀入內存時會很危險。不確定你正在縮小的文件的大小,但如果你打大文件,這可能會導致OOM問題等。我建議將文件的其餘部分進行流式處理並逐行寫入。這一切都假設你的文件可能會更大,如果你打算TPL或不TPL(同時發生多個收縮)。 –

回答

4

建議你使用像log4net的或NLOG(或任何其他),以提高你的代碼,你可以在最小作出適當的日誌框架確保你總是有使用關閉溪邊:

private static void ShrinkFile(string file) 
{ 
    using(var sr = new StreamReader(file)) 
    { 
    for (int i = 0; i < 9; i++) // throw away the first 10 lines 
    { 
     sr.ReadLine(); 
    } 

    // false here means to overwrite existing file. 
    using (StreamWriter sw = new StreamWriter(file, false)) 
    { 
     sw.Write(sr.ReadToEnd()); 
    } 
    } 
} 

我也避免將ReadToEnd寫入字符串,因爲您可以直接寫入StreamWriter。

+0

這就是爲什麼我想問一個這樣的問題。我不知道如何使用關閉SteamReader併爲我處置它。 – jac

+0

Piras - 我不得不使用中間字符串變量,因爲當我嘗試打開一個新的StreamWriter時,使用StreamReader打開的同一個文件時,我得到了一個正在使用的文件異常。 – jac