DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ファイルをサイクリックに書き込む方法について

環境/言語:[Win2000, C#, VS.NET2003]
分類:[.NET]

お世話になります。皆様の知恵をお貸し下さい。

ログファイルを作成で、一定のサイズをオーバーしないように
サイクリック処理を施したいと考えています。

テキストファイルのストリームを使った書き込みで、
行数を指定して書き込むことは方法はありますか?
(その行数に既にあるデータは上書きします。)

**

C言語のサイクリック処理でしたら、
順次書き込み処理を行っていて、サイズオーバーするようでしたら
Seekを先頭に戻すという方法を知っています。

C#でもFileStreamクラスにSeekメンバがあったので
同様の方法が実現できるとは思います。

ですが、せっかくStreamWriterクラスにて
ストリームを使った書き込みができるのですから
わざわざバイト配列に変換する手間が惜しいと感じました。

過去ログを見ましたが、
ファイル内のデータを検索→置換する方法についてのご質問に対するご回答で
一旦全データを一気に読んで編集、一気に書き込むとありましたが、
小生、サーバのアプリを作成しておりまして、
複数のクライアントからの頻繁に発生する通信ログを、
上記のような処理で行っていては、負荷が大きいと思うのです。

机上の話しだけで申し訳ありませんが、
「行数を指定して書き込む」というアプローチから、
なにか知恵がありましたらと、質問してみました。
宜しければ、ご教授願います。
こんにちは中です。

サーバプログラミングだからというのとは別の意味で、ロギング君をstaticにして、ArrayListにいれて、何件たまればFlushのようなつくりにしないとファイル書き込みがパフォーマンス劣化させてしまいます。
で、そういう風にシリアル化してしまえば固まり単位でしか書き込みはしないですよね?


----------------------------------------------------
中博俊 (MSMVP Visual Studio C# Since 2004-)
<a href="http://blogs.users.gr.jp/naka/">http://blogs.users.gr.jp/naka/</a>
naka@wankuma.com
VisualStudio2005のすべてのエディションにUnitTestを。投票募集中↓
<a href="http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackId=FDBK17344">http://lab.msdn.microsoft.com/ProductFeedback/viewFeedback.aspx?feedbackId=FDBK17344</a>
お世話になります。

中 博俊様
ご回答ありがとうございます。

けれどもすみません。私の勉強不足です。
「ロギング君」「Flush」…理解できませんでした。

なんとかニュアンスから、
「全データは常にメモリに保持しておいて、
書き込むは、一旦ファイルの内容を全消去した後に全書き込みする。」
という内容であると受け取りました。

せっかくのアドバイスでしたが、
恐れながら、やはりパフォーマンスが悪そうな気がしました。
でもでも、本当にありがとうございました。
> けれどもすみません。私の勉強不足です。
> 「ロギング君」「Flush」…理解できませんでした。
中さんからサポートは入ると思いますが・・・
ロギング君はおそらくロギングを担当するクラスか機能の集まりと思われます。
FlushはFileStream.Flush メソッド と思われます。

> なんとかニュアンスから、
> 「全データは常にメモリに保持しておいて、
> 書き込むは、一旦ファイルの内容を全消去した後に全書き込みする。」
> という内容であると受け取りました。
全消去するのではありません。
追加するログの分を一定の量メモリに蓄えて一定の量を超えたら、またはタイマーにより記憶していた分をまとめて書き込むのです。

#願わくば中さんの書かれている意図と違っていないことを願いつつ。
すみません。返事が遅れてしまいました。

えムナウ様。
ご教授ありがとうございます。
結局慣れ親しんだバイナリ書き込み方法を採用しました。
お時間を頂き、感謝しています。

DOBON.NET | プログラミング道 | プログラミング掲示板