2011-06-22 7 views
4

現在、ゲームサーバー用のレポートボットを作成しています。 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

答えて

0

私はあなたが言うとき、ゲームサーバーがシャットダウンした意味と仮定します。

サーバが接続の場合はどうなるのシャットダウン

になると、それが唯一のファイルを読み込み、ゲームサーバーと壊れていますか? FileSystemWatcher.Changedイベントは起動しますか?

これは、サーバーがファイルストリームを閉じてFileSystemWatcher.Changedイベントを上げていない開いているログファイルを保持するやり方かもしれません。

NotifyFilter.Sizeを使用してトリガーを試したことがありますか?すなわち:

watcher.NotifyFilter = NotifyFilters.Size; 

デフォルトではLastWrite, FileName, DirectoryNameが使用されます。したがって、何らかの理由でLastWriteが更新されていないのにサイズがそうである場合、それはトリガします。

さらにそれを診断するには、あなたはに対して通知されるプロパティを記録し、期待どおりに変化していることを確認するためにタイマーでFileInfoオブジェクトを使用してファイルのプロパティを確認できます。ただし、NotifyPropertyが実際に変更されている場合、FileSystemWatcher.Changedイベントが発生します。私の推測は、シャットダウンまでファイルに完全にフラッシュされない外部サーバー側のファイルシステムメカニズムです。

+0

まだファイルサイズ通知フィルタを試していない。私はそれを行って、それが働いたかどうかを知らせます。とにかく助けてくれてありがとう –

+0

私はサイズを試してみましたが、実際には部分的にしか動作しません。これで、変更イベントが発生しますが、エクスプローラで実際にファイルをクリックしたときにのみ発生します。たぶん私はまだ何か間違っている?私はfileinfoオブジェクトでチェックして、sizeプロパティが更新されているはずです。 lastwriteプロパティはそれが以前に失敗した理由ではありません。助言がありますか? –

+0

今のところ私は回避策を見つけました。元のファイルをコピーして、100ミリ秒ごとにタイマーに名前を変更し、ファイルシステムウォッチャーがコピーしたファイルを監視するようにします。そうすれば、それは働いているようです。しかし、それは望ましい方法ではありません。ですから、もしあなたが他の提案をしているのであれば、私はすべての耳をしているかもしれません。 –

関連する問題