.NET TIPS ファイルやディレクトリの作成/変更/削除を監視するには?デジタルアドバンテージ 遠藤 孝信2005/03/25 |
|
|
.NET Frameworkのクラス・ライブラリには、ファイルやディレクトリの作成/変更/削除を監視するためのFileSystemWatcherクラス(System.IO名前空間)が用意されている(ただしWindows 98/Meでは利用できない)。これを利用すると、特定のディレクトリにファイルが作成された、特定のファイルが修正された、といったタイミングで、それらのファイルに対して何らかの処理を行うようなアプリケーションを容易に作成することができる。
FileSystemWatcherクラスの利用方法は簡単で、まずそのインスタンスを作成し、以下の表に示すような各プロパティを設定する。
プロパティ | 説明 | デフォルト値 |
Path | 監視するディレクトリのパス | なし |
IncludeSubdirectories | サブディレクトリを監視するかどうかを示すフラグ | false |
Filter | 監視するファイル | 「*.*」 |
NotifyFilter | 監視する変更の種類 (NotifyFilters列挙体の値) |
NotifyFilters.LastWrite | NotifyFilters.DirectoryName | NotifyFilters.FileName (3つの値の論理和) |
EnableRaisingEvents | 監視を有効にするかどうかを示すフラグ | false |
InternalBufferSize | 受け取った通知を格納する内部バッファのサイズ | 8192Bytes(8KBytes) |
FileSystemWatcherクラスの主要なプロパティ |
Filterプロパティでは、監視対象となる特定のファイルを指定することもできるが、「*.txt」や「*.jpg」といった特定の種類のファイルも指定可能だ。
EnableRaisingEventsプロパティをtrueに設定すると監視処理が開始される。監視が不要な場合には、一時的にこのプロパティをfalseに設定すればよい。
NotifyFilterプロパティでは、監視するディレクトリやファイルの変更の種類を、NotifyFilters列挙体(System.IO名前空間)の値の組み合わせ(論理和:C#では「|演算子」、VB.NETではOr演算子を使用する)により指定する。
以下に、NotifyFilters列挙体で定義されている値の一覧を示す。
値 | 説明 |
Attributes | ファイルまたはフォルダの属性 |
CreationTime | ファイルまたはフォルダが作成された時刻 |
DirectoryName | ディレクトリの名前 |
FileName | ファイルの名前 |
LastAccess | ファイルまたはフォルダへの最終アクセス日時 |
LastWrite | ファイルまたはフォルダへの最終書き込み日時 |
Security | ファイルまたはフォルダのセキュリティ設定 |
Size | ファイルまたはフォルダのサイズ |
NotifyFilters列挙体で定義されている値の一覧 |
NotifyFilterプロパティで指定した項目が変化するときには、以下のイベントが発生するようになっている。このため、通知を受けたいイベントに関しては、インスタンス作成時に各イベントに対して通知を受け取るメソッドを登録しておく。
イベント | イベントの発生するタイミング |
OnCreated | ファイルまたはディレクトリが作成されたとき |
OnDeleted | ファイルまたはディレクトリが削除されたとき |
OnRenamed | ファイルまたはディレクトリの名前が変更されたとき |
OnChanged | 以下のいずれかが変更されたとき ・サイズ ・属性 ・最終書き込み日時 ・最終アクセス日時 ・セキュリティ設定 |
OnError | 内部バッファがオーバーフローした(あふれた)とき |
FileSystemWatcherクラスで発生するイベント |
次に、FileSystemWatcherクラスを利用した簡単なサンプル・プログラムを示す。
FileSystemWatcherクラスを利用したサンプル・プログラム
このサンプル・プログラムでは、Cドライブ配下のすべてのディレクトリに対して.TXTファイルの作成と削除を監視し、それらが発生した場合には、そのイベントの種類とファイルのフルパスを表示する。
|
|
テキスト・ファイルの作成/削除を監視するC#のサンプル・プログラム(filewatch.cs) | |
|
|
テキスト・ファイルの作成/削除を監視するVB.NETのサンプル・プログラム(filewatch.vb) | |
イベントを処理するDoWorkメソッドでは、メソッドの第2パラメータであるFileSystemEventArgsクラス(System.IO名前空間)のオブジェクトから、発生したイベントの種類(ChangeTypeプロパティ)や、ファイルのフルパス(FullPathプロパティ)などが取得可能だ。
このプログラムを実行したまま、例えばエクスプローラ上で、「C:\転送元」ディレクトリにある「mywork.txt」というファイルを「C:\転送先」ディレクトリに移動した場合には、以下のような出力が得られる。
Deleted |
さらに移動したファイルを削除した場合には、出力は以下のようになる。これはファイルが「ごみ箱」に移動されたことを示している。
Deleted |
FileSystemWatcherクラスの注意点
リファレンス・マニュアルにもあるように、ファイル作成などの単純と思える操作に関しても、複数のイベントが発生する場合がある。これは、監視対象となるファイルを作成、変更する外部のアプリケーションの内部動作によるところも大きい。アプリケーションによっては、例えばファイルの作成時に何度かそのファイルにアクセスしたり(最終アクセス日時が何度も変化する)、一時ファイルをリネームすることにより最終的な出力ファイルを作成したりする場合もあるためだ。
実アプリケーションでFileSystemWatcherクラスを利用する場合には、発生するイベントをまず実際に確認し、必要なNotifyFilterプロパティとイベントの種類をよく吟味する必要があるだろう。
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル 使用ライブラリ:FileSystemWatcherクラス(System.IO名前空間) 使用ライブラリ:NotifyFilters列挙体(System.IO名前空間) 使用ライブラリ:FileSystemEventHandlerデリゲート(System.IO名前空間) |
|
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|