【C#】FileSystemWatcherのe.Nameはどこから取得している?イベント引数の仕組みを解説

システム開発

はじめに

既存システムを調査していたとき、次のイベントハンドラーを見つけました。

private void ExecuteInsertDataApplication(
    object source,
    System.IO.FileSystemEventArgs e)

このメソッドの中では、

Path.GetFileNameWithoutExtension(e.Name)

を使用していました。

そこで疑問に思ったのが、

「e.Nameってどこで設定されているんだろう?」

ということです。

メソッド内を探しても代入している箇所はありません。

今回は、この疑問を調べた結果をまとめます。

最初に確認したこと

まずはこのメソッドを呼び出している箇所を探しました。

すると次のコードを発見しました。

AddHandler watcher.Changed, AddressOf ExecuteInsertDataApplication
AddHandler watcher.Created, AddressOf ExecuteInsertDataApplication

(C#の場合は watcher.Created += ExecuteInsertDataApplication; のような書き方になります。)

ここで

「イベントから呼ばれている」

ことが分かりました。

e.Nameはどこから設定される?

答えは、

FileSystemWatcherがFileSystemEventArgsを生成するときに設定しています。

ファイルが作成・変更されると、

  1. FileSystemWatcherがファイル変更を検知
  2. FileSystemEventArgsを生成
  3. ファイル名を Name プロパティへ設定
  4. イベントハンドラーへ渡す

という流れになります。

そのため、自分で

e.Name = "sample.txt";

のようなコードを書く必要はありません。

今回のコードでは

例えば

sample.csv

というファイルが作成されると、

e.Name

には

sample.csv

が入っています。

さらに

Path.GetFileNameWithoutExtension(e.Name)

を実行すると、

sample

だけを取得できます。

調査していて勘違いしたこと

私は最初、

「どこかでe.Nameに値を代入しているコードがあるはず」

と思い、プロジェクト全体を検索していました。

しかし、いくら探しても見つかりません。

実際には、

イベント引数として.NETが自動的に渡していた

という仕組みでした。

イベント処理に慣れていないと、この点は少し分かりにくいかもしれません。

まとめ

今回分かったことは次のとおりです。

  • eFileSystemEventArgs
  • e.Name は FileSystemWatcher が設定している
  • 開発者が代入する必要はない
  • Path.GetFileNameWithoutExtension() を使うことで拡張子を除いたファイル名を取得できる

既存システムを解析していると、「この値はどこから来たの?」と疑問に思うことがあります。

今回のようにイベントの仕組みを理解すると、コードの流れも追いやすくなります。

同じ疑問を持った方の参考になれば幸いです。

コメント

タイトルとURLをコピーしました