あるフォルダのファイルが変更(または存在したら)されたら取り込む。
ありがちな処理ですよね
FileSystemWatcherはファイルの変更を監視してくれるコントロールです。
変更があると通知のイベントをあげてくれます。
そのイベントで処理するような感じですね。
使い方としては
①監視対象ディレクトリを指定する
②監視対象の拡張子を指定する(全てを指定する場合は空にする)
③サブディレクトリ配下も含めるか指定する
④監視する変更の種類を指定する
を指定してイベントがあがってくるのを待ち、来たら処理する感じです。
監視する変更の種類(NotifyFilters)
フィールド | 内容 |
Attributes | ファイルまたはフォルダーの属性 |
CreationTime | ファイルまたはフォルダーが作成された時刻 |
DirectoryName | ディレクトリの名前 |
FileName | ファイルの名前です |
LastAccess | ファイルまたはフォルダーを最後に開いた日付 |
LastWrite | ファイルまたはフォルダーへの最終書き込み日付 |
Security | ファイルまたはフォルダーのセキュリティ設定 |
Size | ファイルまたはフォルダーのサイズ |
サンプルでは
D:\監視DIR配下
拡張子がtxtのファイルを監視対象としています。
サンプルは3つの部品を使用しています。
No | 部品 | name | text |
1 | FileSystemWatcher | fileSystemWatcher1 | |
2 | Button | btnStart | 監視開始 |
3 | Button | btnEnd | 監視終了 |
プログラミング
言語:C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace WindowsFormsApp8
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 画面起動時処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_Load(object sender, EventArgs e)
{
// 監視を停止する
fileSystemWatcher1.IncludeSubdirectories = false;
// ファイル変更、作成、削除のイベントをファイル変更メソッドにあげる
fileSystemWatcher1.Changed += new FileSystemEventHandler(fileChanged);
fileSystemWatcher1.Created += new FileSystemEventHandler(fileChanged);
fileSystemWatcher1.Deleted += new FileSystemEventHandler(fileChanged);
// ファイル名変更のイベントをファイル名変更メソッドにあげる
fileSystemWatcher1.Renamed += new RenamedEventHandler(fileRenamed);
// 監視対象ディレクトリを指定する
fileSystemWatcher1.Path = @"D:\監視DIR\";
// 監視対象の拡張子を指定する(全てを指定する場合は空にする)
fileSystemWatcher1.Filter = "*.txt";
// サブディレクトリ配下も含めるか指定する
fileSystemWatcher1.IncludeSubdirectories = true;
// 監視する変更を指定する
fileSystemWatcher1.NotifyFilter = NotifyFilters.LastAccess |
NotifyFilters.LastWrite |
NotifyFilters.FileName |
NotifyFilters.DirectoryName;
// 通知を格納する内部バッファ 既定値は 8192 (8 KB) 4 KB ~ 64 KB
fileSystemWatcher1.InternalBufferSize = 1024 * 8;
}
/// <summary>
/// 監視開始ボタンクリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnStart_Click(object sender, EventArgs e)
{
// 監視を実行する
fileSystemWatcher1.EnableRaisingEvents = true;
}
/// <summary>
/// 監視終了ボタンクリック処理
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnEnd_Click(object sender, EventArgs e)
{
// 監視を停止する
fileSystemWatcher1.IncludeSubdirectories = false;
}
/// <summary>
/// ファイル変更
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void fileChanged(object sender, FileSystemEventArgs e)
{
string s = String.Format($"{DateTime.Now:yyyy/MM/dd HH:mm:ss} :");
//変更があったときに結果を表示する
switch (e.ChangeType)
{
case System.IO.WatcherChangeTypes.Changed:
s += $"【{e.ChangeType.ToString()}】{e.FullPath}";
break;
case System.IO.WatcherChangeTypes.Created:
s += $"【{e.ChangeType.ToString()}】{e.FullPath}";
break;
case System.IO.WatcherChangeTypes.Deleted:
s += $"【{e.ChangeType.ToString()}】{e.FullPath}";
break;
}
Console.WriteLine(s);
}
/// <summary>
/// ファイル名変更
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private static void fileRenamed(object sender, RenamedEventArgs e)
{
string s = String.Format($"{DateTime.Now:yyyy/MM/dd HH:mm:ss} :");
s += $"【{e.ChangeType.ToString()}】{e.OldName} → {e.FullPath}";
Console.WriteLine(s);
}
}
}
実行結果
監視開始
ファイルの作成
ファイルの変更(ファイルを開き編集し保存)
ファイル名の変更
ファイルの削除
監視終了
以上です。
それでは、また!