はじめに
既存システムを調査していたとき、次のイベントハンドラーを見つけました。
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を生成するときに設定しています。
ファイルが作成・変更されると、
- FileSystemWatcherがファイル変更を検知
- FileSystemEventArgsを生成
- ファイル名を
Nameプロパティへ設定 - イベントハンドラーへ渡す
という流れになります。
そのため、自分で
e.Name = "sample.txt";
のようなコードを書く必要はありません。
今回のコードでは
例えば
sample.csv
というファイルが作成されると、
e.Name
には
sample.csv
が入っています。
さらに
Path.GetFileNameWithoutExtension(e.Name)
を実行すると、
sample
だけを取得できます。
調査していて勘違いしたこと
私は最初、
「どこかでe.Nameに値を代入しているコードがあるはず」
と思い、プロジェクト全体を検索していました。
しかし、いくら探しても見つかりません。
実際には、
イベント引数として.NETが自動的に渡していた
という仕組みでした。
イベント処理に慣れていないと、この点は少し分かりにくいかもしれません。
まとめ
今回分かったことは次のとおりです。
eはFileSystemEventArgse.Nameは FileSystemWatcher が設定している- 開発者が代入する必要はない
Path.GetFileNameWithoutExtension()を使うことで拡張子を除いたファイル名を取得できる
既存システムを解析していると、「この値はどこから来たの?」と疑問に思うことがあります。
今回のようにイベントの仕組みを理解すると、コードの流れも追いやすくなります。
同じ疑問を持った方の参考になれば幸いです。


コメント