私のアプリケーションはログファイルを書き込みます(現在はlog4netを使用しています)。私はタイマーとバックグラウンドワーカーをセットアップして、ログファイルを読み込んで、その内容を書いている間に自分のフォームのコントロールに印刷したいと思っています。BackgroundWorker&Timer、ログファイルの新しい行だけを読み込んでいますか?
FileSystemWatcher クラスは使用できません。壊れているように見えることがあります。イベント「変更されました」が発生することがあります。そしてそれは非常に低い "プール率"を持っています。
私はTimerとFileSystemWatcherを作成しました。タイマーの「チック」イベントでは、バックグラウンドワーカーがそのジョブを行います。
質問は:作業者の最後のチェックから追加された行だけを読み取る方法は?
public LogForm()
{
InitializeComponent();
logWatcherTimer.Start();
}
private void logWatcherTimer_Tick(object sender, EventArgs e)
{
FileInfo log = new FileInfo(@"C:\log.txt");
if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log);
}
private void logWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Read only new lines since last check.
FileInfo log = (FileInfo) e.Argument;
// Here is the main question!
}
EDIT:コードソリューション(多分もっとエレガントな方法はありますか?):
private void logWatherWorker_DoWork(object sender, DoWorkEventArgs e)
{
// retval
string newLines = string.Empty;
FileInfo log = (FileInfo) e.Argument;
// Just skip if log file hasn't changed
if (lastLogLength == log.Length) return;
using (StreamReader stream = new StreamReader(log.FullName))
{
// Set the position to the last log size and read
// all the content added
stream.BaseStream.Position = lastLogLength;
newLines = stream.ReadToEnd();
}
// Keep track of the previuos log length
lastLogLength = log.Length;
// Assign the result back to the worker, to be
// consumed by the form
e.Result = newLines;
}
私はあなたの方法を選んだ、ありがとう。コードソリューションを組み込むために最初の投稿を編集しました。 – gremo
ありがとうたくさんのソリューションを投稿してください –