これ、いちいちボタンクリックしたり明にサービスを常駐させなくても.net frameworkのAPIで監視しててくれるんやねぇ…便利な世の中になったもんだ。
ざっくりポイントはこんなとこ。
- FileSystemWatcherクラスを作成する
- FileSystemWatcher.NotifyFilterプロパティでファイルの修正方法を設定する
- FileSystemEventHandler()メソッドでイベントを処理するメソッドの名前を登録する
- イベントの処理をするメソッドを定義する
まずはソリューションを作る。
とりあえず、今回は”Windows フォーム アプリケーション”でフォームだけのプロジェクトを作っておく。
んで、検知する処理はフォーム自体に実装することにする。
サンプルコードとしてはこんな感じ。
- FileSystemWatcherをプロパティとして定義する
まずは、FileSystemWatcherをフォームのプロパティに定義しておく。
namespace Proto
{
public partial class FormMain : Form
{
private System.IO.FileSystemWatcher Watcher
{
get;
set;
} = null;
public FormMain()
{
InitializeComponent();
}
}
:
(ここからは文章が長くなるので省略)
:
}
namespace Proto
{
public partial class FormMain : Form
{
private System.IO.FileSystemWatcher Watcher
{
get;
set;
} = null;
public FormMain()
{
InitializeComponent();
}
}
:
(ここからは文章が長くなるので省略)
:
}
namespace Proto { public partial class FormMain : Form { private System.IO.FileSystemWatcher Watcher { get; set; } = null; public FormMain() { InitializeComponent(); } } : (ここからは文章が長くなるので省略) : }
次はフォームが読み込まれたときのイベントを処理するメソッド。
こいつはデザイナーでフォームをダブルクリックすると自動で作ってくれるメソッドに定義していく。
監視するフォルダーのパスはとりあえず”C:\Sample”ってフォルダーにしておく。
/// <summary>
/// フォームがロードされたときのイベントを処理するメソッド
/// </summary>
/// <param name="objSender">イベント</param>
/// <param name="objEventArguments">引数</param>
private void FormMain_Load(object objSender, EventArgs objEventArguments)
{
try
{
// 監視するオブジェクトを作成する
string strTargetFolderPath = @"C:\Sample"; // 監視するフォルダーのパス
Watcher = new FileSystemWatcher(strTargetFolderPath);
// 監視する種類を設定する
// ※今回はファイルの作成日付だけにする
Watcher.NotifyFilter = (System.IO.NotifyFilters.FileName | System.IO.NotifyFilters.CreationTime );
// イベントを処理するメソッドを登録する
Watcher.Created += new FileSystemEventHandler(Function);
// 監視を始める
// ※本来ならちゃんと監視を止めるようなロジックが必要だけど今回は省略
Watcher.EnableRaisingEvents = true;
}
catch(Exception objException)
{
Console.WriteLine(objException.Message);
}
}
/// <summary>
/// フォームがロードされたときのイベントを処理するメソッド
/// </summary>
/// <param name="objSender">イベント</param>
/// <param name="objEventArguments">引数</param>
private void FormMain_Load(object objSender, EventArgs objEventArguments)
{
try
{
// 監視するオブジェクトを作成する
string strTargetFolderPath = @"C:\Sample"; // 監視するフォルダーのパス
Watcher = new FileSystemWatcher(strTargetFolderPath);
// 監視する種類を設定する
// ※今回はファイルの作成日付だけにする
Watcher.NotifyFilter = (System.IO.NotifyFilters.FileName | System.IO.NotifyFilters.CreationTime );
// イベントを処理するメソッドを登録する
Watcher.Created += new FileSystemEventHandler(Function);
// 監視を始める
// ※本来ならちゃんと監視を止めるようなロジックが必要だけど今回は省略
Watcher.EnableRaisingEvents = true;
}
catch(Exception objException)
{
Console.WriteLine(objException.Message);
}
}
/// <summary> /// フォームがロードされたときのイベントを処理するメソッド /// </summary> /// <param name="objSender">イベント</param> /// <param name="objEventArguments">引数</param> private void FormMain_Load(object objSender, EventArgs objEventArguments) { try { // 監視するオブジェクトを作成する string strTargetFolderPath = @"C:\Sample"; // 監視するフォルダーのパス Watcher = new FileSystemWatcher(strTargetFolderPath); // 監視する種類を設定する // ※今回はファイルの作成日付だけにする Watcher.NotifyFilter = (System.IO.NotifyFilters.FileName | System.IO.NotifyFilters.CreationTime ); // イベントを処理するメソッドを登録する Watcher.Created += new FileSystemEventHandler(Function); // 監視を始める // ※本来ならちゃんと監視を止めるようなロジックが必要だけど今回は省略 Watcher.EnableRaisingEvents = true; } catch(Exception objException) { Console.WriteLine(objException.Message); } }
んで、ファイルが作成されたときのイベントを処理するメソッドはこんな感じ。
/// <summary>
/// ファイルが新規作成されたときのイベントを処理するメソッド
/// </summary>
/// <param name="objSender">イベント</param>
/// <param name="objEventArguments">引数</param>
private void Function(object objSender, FileSystemEventArgs objEventArguments)
{
try
{
// 作成されたファイルのパスをメッセージボックスで表示する
string strFilePath = objEventArguments.FullPath;
string strMessage = string.Format("\"{0}\"が作成されました!", strFilePath);
MessageBox.Show(strMessage);
}
catch (Exception objException)
{
Console.WriteLine(objException.Message);
}
}
/// <summary>
/// ファイルが新規作成されたときのイベントを処理するメソッド
/// </summary>
/// <param name="objSender">イベント</param>
/// <param name="objEventArguments">引数</param>
private void Function(object objSender, FileSystemEventArgs objEventArguments)
{
try
{
// 作成されたファイルのパスをメッセージボックスで表示する
string strFilePath = objEventArguments.FullPath;
string strMessage = string.Format("\"{0}\"が作成されました!", strFilePath);
MessageBox.Show(strMessage);
}
catch (Exception objException)
{
Console.WriteLine(objException.Message);
}
}
/// <summary> /// ファイルが新規作成されたときのイベントを処理するメソッド /// </summary> /// <param name="objSender">イベント</param> /// <param name="objEventArguments">引数</param> private void Function(object objSender, FileSystemEventArgs objEventArguments) { try { // 作成されたファイルのパスをメッセージボックスで表示する string strFilePath = objEventArguments.FullPath; string strMessage = string.Format("\"{0}\"が作成されました!", strFilePath); MessageBox.Show(strMessage); } catch (Exception objException) { Console.WriteLine(objException.Message); } }
実行してみたらこんな感じになる。
- まずはフォームが表示される…ここでは何も起きない。
- コードで書いてたフォルダー”C:\Sample”を開いてテキストファイルを作成してみる。
ファイルを作成したとこはこんな感じ。
- ファイルを作成したタイミングでメッセージボックスが表示される。
ってことで、新しいファイルが作成されたことを検知できた。
ちなみに、このサンプルコードで検知できるのはこれ。
- フォルダーで新規にファイルを作成したとき
- フォルダーに別の場所のファイルをコピーまたは移動したとき
んで、検知できないのはこれ。
これはFileSystemWatcher.NotifyFilterプロパティとFileSystemEventHandler()メソッドでイベントの登録すれば検知できる。
- ファイルを編集したとき
- ファイルを削除したとき
んまま、明日への自分へのメモってことで。