前回のDOLのチャットログのフォーマット、更新のタイミングを調べた結果から、実際にDOLを起動してログファイルが作成されるタイミング、会話時のログの更新タイミングを検知するソフトを作成してみます
(今回は、これらのタイミングをリアルタイムで検知して、チャットの内容を表示するまでのソフトを作成します)
以下に、ソフトを作成する環境を示します
(現在のわたしの開発環境です)
OS:Windows7 64bit Ultimate
IDE:Visual Studio 2010 Ultimate Bata2
.NET:.NET Framework 4 Bata2
C#:C# 2010
まず.NETのクラスライブラリから、ファイルの作成や変更を監視する「FileSystemWatcher」クラスを使って、ファイルの作成について監視します
しかしここで、「FileSystemWatcher」クラスはファイルの変更についても監視できるのですが、DOLのチャットログについては変更のイベントをうまく受け取ることができません
この原因として考えられるのは、
DOLではチャットログファイルのファイルストリームを常に開いた状態で保持しているため、更新データがディスクキャッシュからディスクにフラッシュされないため、イベントが発生しないのではないかと考えられ、ゲーム上でログが更新されたタイミングでエクスプローラなどからファイルをポイントするなどのファイルの情報取得操作が発生すると、「FileSystemWatcher」クラスに更新イベントが発生するためです
上記現象から、ファイルの更新に関しては「FileSystemWatcher」クラスではなく、タイマーを使ったログファイルのポーリングで監視します
まずは、ログ作成の監視
public class LogWatch { public LogWatch() { FileSystemWatcher watch = new FileSystemWatcher(); watch.Path = Path.Combine( Environment.GetFolderPath( Environment.SpecialFolder.Personal ), @"KOEI\GV Online\Log\Chat" ); watch.Filter = "??????????????.html"; watch.IncludeSubdirectories = false; watch.NotifyFilter = NotifyFilters.FileName; watch.Created += new FileSystemEventHandler( LogCreated ); watch.EnableRaisingEvents = true; } private static void LogCreated( object sender, FileSystemEventArgs e ) { Console.WriteLine( "LogCreated : {0}", e.Name ); } }
上記のプログラムでは、 「Environment.GetFolderPath( Environment.SpecialFolder.Personal )」メソッドを呼び出すことで、現在のユーザーのドキュメントライブラリ(WindowsXPではマイドキュメント)のパスを取得できます
このパスに、DOLのログファイルパスである「KOEI\GV Online\Log\Chat」を連結します
また、「Filter」プロパティに「??????????????.html」を指定することで、?の個数と同じ文字数の名前が指定されたhtmlファイルのみを、監視の対象とするようにしています
続いて、ログ更新のポーリングをします
public class WatchTimer { public WatchTimer() { // タイマーを作成する Timer timer = new Timer( new TimerCallback( ProgressFunction ), null, 0, 200 ); } protected virtual void ProgressFunction( object Parameter ) { Console.WriteLine( "ProgressFunction : {0}", DateTime.Now.ToString( "HH:mm:ss.FFF" ) ); } }
上記のプログラムでは、インスタンス作成直後から200ms間隔でイベントが呼び出されます
タイマーイベントで呼び出された「ProgressFunction」関数内でログファイルの情報を読み取り、更新されていたらログファイルを読み込むように変更すればよさそうです
今日は実際にチャットログが更新されたらチャットの内容まで読み取るソフトを作成する予定でしたが、眠いので今日はここまで!
コメントを残す
コメントを投稿するにはログインしてください。