2013-11-22 45 views
3

我有一個winForm應用程序,其中有一個用於記錄目的的文本文件。我想限制其大小爲10 MB,以便如果通過此限制並寫入新數據,則會刪除文本文件中最舊的數據以爲新數據騰出空間。任何有用的建議?限制文本日誌文件的好方法

+1

在這裏你去http://www.dotnetperls.com/fileinfo-length。快樂的編碼! – Misters

+0

也許是一種奇怪的方法,但是你可以計算字符的數量並將它們乘以尺寸。 – Max

回答

9

使用一些日誌框架(我建議NLoglog4net,都可以從NuGet)提供滾動日誌文件功能。

E.g.與log4net的,你可以使用以下配置日誌文件大小限制爲10Mb

<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="log.txt" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Size" /> 
    <maxSizeRollBackups value="10" /> 
    <maximumFileSize value="10MB" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %-5level %logger - %message%newline" /> 
    </layout> 
</appender> 

NLOG配置看起來像

<target xsi:type="File" 
     name="RollingFileAppender" 
     layout="${verbose}"   
     archiveAboveSize="10000000" 
     maxArchiveFiles="10" 
     archiveFileName="${basedir}/archives/log.{#####}.txt" 
     archiveNumbering="Sequence"   
     fileName="log.txt" /> 
+0

感謝您的回覆。有沒有任何有用的資源指導如何將此框架與您當前的winForm應用程序集成。 – user2968369

+0

@ user2968369只需添加對日誌框架的引用(通過NuGet),然後爲框架添加配置(在app.config或單獨的配置文件中),在應用程序中檢索記錄器並寫入日誌[請參閱NLog Tuturial](https:// github.com/nlog/nlog/wiki/Tutorial) –

3

我會使用日誌庫,像log4net的。 RollingFileAppender完全符合您的要求。

1

如果你不想使用日誌框架(儘管你可能在文件的長度在每次寫入時間

  • 查找(或者其它的一些常規時期)
  • 當它超過了:應該,真的),那麼你可以做以下限制,執行修剪操作 - 這將涉及從文件的開始處開始,然後遍歷文件讀取行,直到讀取足夠的數據以修剪。找到這個位置之後,有幾種方法可以從文件的開頭刪除空格,但是除非您很樂意將整個文件加載到內存中,否則這些空間都不是很有吸引力,現在對於10MB文件來說這並不合理。

但是,要實現的關鍵是從文件中刪除更多的文件,而不是恢復到極限以下的最小值 - 例如讓文件增長到11MB,然後將其修剪回10MB。那麼在每個1MB的日誌記錄後,你只能運行一個修剪週期。如果你對此很天真,那麼你會發現自己正在爲每一條登錄線修剪,這是荒謬的。

但是實際上,已經存在的優秀的.NET日誌記錄框架是一種更好的方法 - 例如,它們會像異步日誌記錄和關鍵的日常日誌滾動月份一樣。

+0

嗯,有趣。我們如何在文件開始時進行修剪操作。比如我如何從文件開始讀取1 MB的數據。刪除它再次使我的文件大小回到10 MB? – user2968369

+0

某些形式的複製將涉及 - 將數據複製到同一文件中的較早點,或者複製到另一個文件中,然後調用File.Replace。您也許可以考慮使用File.ReadLines,然後使用「Skip()」調用來刪除特定數量的行。不幸的是,從文件中刪除空間是緩慢和乏味的,這就是爲什麼大多數數據庫將文件從壓縮文件中刪除的原因。 –

+0

嗯,是的,我注意到有沒有像File.DeleteLine – user2968369