2008年12月10日水曜日

[.NET]FileSystemWatcher

VS2005以降だと思いますが、FileSystemWatcherというコンポーネントが存在します。
興味があったのでちょっと使ってみました。

FileSystemWatcherではEnableRaisingEventsというプロパティにて、イベント処理型と、変更待機のいずれかを選択することができます。
以下の例では、サブフォルダ配下も含め、ファイルの生成・更新・リネーム・削除を監視し何かあったら画面に表示するというサンプルです。イベント処理のタイプで実装しています。


public partial class Dust28Form : Form
{
    public Dust28Form()
    {
        InitializeComponent();
    }


    private void Dust27Form_Load(object senderEventArgs e)
    {
        //デザイナで以下のプロパティが設定してある

        ////サブディレクトリを含めるかどうか
        //fileSystemWatcher.IncludeSubdirectories = true;
        ////ファイル名のフィルタリング(ぜんぶ)
        //fileSystemWatcher.Filter = true;
        ////監視対象フォルダ
        //fileSystemWatcher.Path = "c:\temp";
        ////監視対象のイベント
        //fileSystemWatcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite | NotifyFilters.DirectoryName;


        //イベント ハンドラ呼び出しをマーシャリングするために使用するオブジェクト
        fileSystemWatcher.SynchronizingObject = this;
        //初期状態は機能を無効にする
        fileSystemWatcher.EnableRaisingEvents = false;
    }

    private void btnMonitor_Click(object senderEventArgs e)
    {
        //ボタン押下イベント。機能の有効無効を排他的に切り替えている

        //今のステータスと入れ替える
        fileSystemWatcher.EnableRaisingEvents = !fileSystemWatcher.EnableRaisingEvents;
        //ボタンのキャプションを変更する
        btnMonitor.Text = fileSystemWatcher.EnableRaisingEvents ? "監視停止" : "監視開始";
    }

    private void fileSystemWatcher_Changed(object senderSystem.IO.FileSystemEventArgs e)
    {
        //更新
        AddLog("Changed"e);
    }

    private void fileSystemWatcher_Created(object senderSystem.IO.FileSystemEventArgs e)
    {
        //生成
        AddLog("Created"e);
    }

    private void fileSystemWatcher_Deleted(object senderSystem.IO.FileSystemEventArgs e)
    {
        //削除
        AddLog("Deleted"e);
    }

    private void fileSystemWatcher_Renamed(object senderSystem.IO.RenamedEventArgs e)
    {
        //名前変更
        AddLog("Renamed"e);
    }

    private void AddLog(String evtSystem.IO.RenamedEventArgs e)
    {
        //画面への出力(ファイル名変更)
        textLog.AppendText(String.Format("{0} Event={1} File={2} OldFile={3}\n"evte.ChangeTypee.FullPath,e.OldFullPath));
    }

    private void AddLog(String evtSystem.IO.FileSystemEventArgs e)
    {
        //画面への出力(更新・削除・作成)
        textLog.AppendText(String.Format("{0} Event={1} File={2}\n"evte.ChangeTypee.FullPath));
    }

}

0 件のコメント: