astel-labs.net

C#などのプログラミングTipsや雑記をつらつらと書くかもしれないブログです。

  • Home
RSS

DOLチャットツールの検討-ログ更新の監視

Posted on 2010年4月12日 by Nymphaea
No CommentsLeave a comment

前回の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」関数内でログファイルの情報を読み取り、更新されていたらログファイルを読み込むように変更すればよさそうです

 

今日は実際にチャットログが更新されたらチャットの内容まで読み取るソフトを作成する予定でしたが、眠いので今日はここまで!

Categories: C#, 大航海時代Online

 

DOLチャットツールの検討-ログの取り込み
大航海時代Onlineのチャットフィルタツール(仮称)の作成準備

コメントを残す コメントをキャンセル

コメントを投稿するにはログインしてください。

  • 2010年4月
    日 月 火 水 木 金 土
        5月 »
     123
    45678910
    11121314151617
    18192021222324
    252627282930  
  • 最近の投稿

    • WindowsのプロダクトIDを取得する
    • SQL Server – money型とdecimal型を併用した金額計算
    • SQL Server – IDENTITY指定列のIDリセット
    • WCF – Silverlight でのサービスエラーの構成
    • WCF – Silverlight からのサービス呼び出し
  • アーカイブ

    • 2016年12月
    • 2014年6月
    • 2014年5月
    • 2013年7月
    • 2012年11月
    • 2012年7月
    • 2012年5月
    • 2012年4月
    • 2012年1月
    • 2011年8月
    • 2011年4月
    • 2011年1月
    • 2010年11月
    • 2010年10月
    • 2010年9月
    • 2010年8月
    • 2010年7月
    • 2010年6月
    • 2010年5月
    • 2010年4月
  • カテゴリー

    • C#
    • jQuery
    • OpenCV
    • SharePoint
    • Silverlight
    • SQL Server
    • WCF
    • WPF
    • ゲーム
    • プログラミング
    • 大航海時代Online
    • 雑記
© astel-labs.net. Proudly Powered by WordPress | Nest Theme by YChong

このブログで使用されている『大航海時代 Online』に関わる著作権、その他一切の知的財産権は、株式会社コーエーに帰属します。
このブログに掲載している『大航海時代 Online』の画像は、『大航海時代 Online』公式サイトにおいて使用許諾が明示されているもの、もしくは『大航海時代 Online』の有効なアカウントをお持ちのユーザーのみに株式会社コーエーが使用許諾を行ったものです。

このブログ内で公開されているソースコードおよびサンプルプログラムに関わるライセンスはすべて修正BSDライセンス(New BSD License)として公開しています。
但し、サンプルプログラムに含まれる外部アセンブリが同様のライセンスとは限りませんので、利用する前に必ずすべてのライセンスの確認を行ってください。