現在、ゲームサーバー用のレポートボットを作成しています。 gameserverはCall of Duty 4です。このゲームサーバーは、デフォルトでgames_mp.logという名前の.logファイルにすべてのゲーム内の出来事を書き込みます。このファイルは、ゲームサーバーをシャットダウンするまで、ゲームサーバーによって常に開いています。 FileShare.ReadWriteを使用してその一部をカバーするときは、これは問題ではありません。 私が望むのは、このログファイルに追加された新しい行をゲームサーバーによって追加され、IRCに置くということです。ゲームサーバーから新しいデータを取得し続けるログファイルを読み取る
IRCの部分はすでに起動していますが、ログファイルの部分を読むことは私にとってはうまくいきません。私はファイルシステムウォッチャーのようないくつかのことを試しましたが、これは動作していないようです。サーバーがシャットダウンされると、ファイルを読み取るだけです。ログファイルは実際にはサーバーから何かが起きたときに新しいデータを取得しますが、 (私が今あなたを混乱させないことを願っています:)
だから、私がやりたいことはこれです: ログファイルを読み続けます。間もなくgameserverはログファイルに新しい行を追加し、IRCに投稿します。私はIRCに投稿したいと思っていますが、まず読書部を働かせたいと思っています。ここで
はFilesystemwatcherを使用するときに私が使用したコードの一部です:
FileSystemWatcher watcher = new FileSystemWatcher();
private void watching()
{
watcher.Path = @"D:\Games\Call of Duty 4 - Modern Warfare\main";
watcher.Filter = "games_mp.log";
watcher.Changed += new FileSystemEventHandler(watcher_Changed);
watcher.EnableRaisingEvents = true;
}
private void watcher_Changed(object sender, FileSystemEventArgs e)
{
ReadNewData();
}
private void ReadNewData()
{
string line = string.Empty;
FileStream file = new FileStream( @"D:\Games\Call of Duty 4 - Modern Warfare\main\games_mp123.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
file.Seek(previousEndPosition, SeekOrigin.Begin);
TextReader reader = new StreamReader(file);
while((line = reader.ReadLine()) != null)
{
IRCClass.client.SendChat(line, "#CodTest");
}
previousEndPosition = file.Position;
}
うまくいけば、誰かが私を助けることができます。
ピムDröge
まだファイルサイズ通知フィルタを試していない。私はそれを行って、それが働いたかどうかを知らせます。とにかく助けてくれてありがとう –
私はサイズを試してみましたが、実際には部分的にしか動作しません。これで、変更イベントが発生しますが、エクスプローラで実際にファイルをクリックしたときにのみ発生します。たぶん私はまだ何か間違っている?私はfileinfoオブジェクトでチェックして、sizeプロパティが更新されているはずです。 lastwriteプロパティはそれが以前に失敗した理由ではありません。助言がありますか? –
今のところ私は回避策を見つけました。元のファイルをコピーして、100ミリ秒ごとにタイマーに名前を変更し、ファイルシステムウォッチャーがコピーしたファイルを監視するようにします。そうすれば、それは働いているようです。しかし、それは望ましい方法ではありません。ですから、もしあなたが他の提案をしているのであれば、私はすべての耳をしているかもしれません。 –