.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ファイルの作成と削除を監視し、それらが発生した場合には、そのイベントの種類とファイルのフルパスを表示する。

// filewatch.cs

using System;
using System.IO;

public class FileWatcher {
  static void Main() {

    FileSystemWatcher watcher = new FileSystemWatcher();

    watcher.Path = @"c:\";
    watcher.Filter = "*.txt";
    watcher.IncludeSubdirectories = true;
    watcher.NotifyFilter = NotifyFilters.FileName;
    watcher.Created += new FileSystemEventHandler(DoWork);
    watcher.Deleted += new FileSystemEventHandler(DoWork);
    watcher.EnableRaisingEvents = true;

    Console.Read(); // キー入力があるまで待つ
  }

  static void DoWork(object source, FileSystemEventArgs e) {
    Console.WriteLine(e.ChangeType.ToString());
    Console.WriteLine(e.FullPath);
  }
}

// コンパイル方法:csc filewatch.cs
テキスト・ファイルの作成/削除を監視するC#のサンプル・プログラム(filewatch.cs)
 
' filewatch.vb

Imports System
Imports System.IO

Public Class FileWatcher
  Shared Sub Main()
    Dim watcher As FileSystemWatcher = new FileSystemWatcher()

    watcher.Path = "c:\"
    watcher.Filter = "*.txt"
    watcher.IncludeSubdirectories = true
    watcher.NotifyFilter = NotifyFilters.FileName
    AddHandler watcher.Created, AddressOf DoWork
    AddHandler watcher.Deleted, AddressOf DoWork
    watcher.EnableRaisingEvents = true

    Console.Read() ' キー入力があるまで待つ
  End Sub

  Shared Sub DoWork(source As object, e As FileSystemEventArgs)
    Console.WriteLine(e.ChangeType.ToString())
    Console.WriteLine(e.FullPath)
  End Sub
End Class

' コンパイル方法:vbc /r:System.dll filewatch.vb
テキスト・ファイルの作成/削除を監視するVB.NETのサンプル・プログラム(filewatch.vb)

 イベントを処理するDoWorkメソッドでは、メソッドの第2パラメータであるFileSystemEventArgsクラス(System.IO名前空間)のオブジェクトから、発生したイベントの種類(ChangeTypeプロパティ)や、ファイルのフルパス(FullPathプロパティ)などが取得可能だ。

 このプログラムを実行したまま、例えばエクスプローラ上で、「C:\転送元」ディレクトリにある「mywork.txt」というファイルを「C:\転送先」ディレクトリに移動した場合には、以下のような出力が得られる。

Deleted
c:\転送元\mywork.txt
Created
c:\転送先\mywork.txt

 さらに移動したファイルを削除した場合には、出力は以下のようになる。これはファイルが「ごみ箱」に移動されたことを示している。

Deleted
c:\転送先\mywork.txt
Created
c:\recycler\s-1-5-21-911560763-1030517763-475923621-2261\dc4.txt

FileSystemWatcherクラスの注意点

 リファレンス・マニュアルにもあるように、ファイル作成などの単純と思える操作に関しても、複数のイベントが発生する場合がある。これは、監視対象となるファイルを作成、変更する外部のアプリケーションの内部動作によるところも大きい。アプリケーションによっては、例えばファイルの作成時に何度かそのファイルにアクセスしたり(最終アクセス日時が何度も変化する)、一時ファイルをリネームすることにより最終的な出力ファイルを作成したりする場合もあるためだ。

 実アプリケーションでFileSystemWatcherクラスを利用する場合には、発生するイベントをまず実際に確認し、必要なNotifyFilterプロパティとイベントの種類をよく吟味する必要があるだろう。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:FileSystemWatcherクラス(System.IO名前空間)
使用ライブラリ:NotifyFilters列挙体(System.IO名前空間)
使用ライブラリ:FileSystemEventHandlerデリゲート(System.IO名前空間)
 
この記事と関連性の高い別の.NET TIPS
監視により作成/変更が通知されたファイルを開くには?
Windowsアプリケーションでファイルやディレクトリを監視するには?
[ASP.NET]ページから生成されたソース・コードを見るには?
ファイルをコピー/削除/リネーム/移動するには?
ファイルやディレクトリの一覧を取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間