C# ファイルやディレクトリの変更を監視する

C#サンプルコードプログラミング

概要説明

あるフォルダのファイルが変更(または存在したら)されたら取り込む。

ありがちな処理ですよね

FileSystemWatcherはファイルの変更を監視してくれるコントロールです。

変更があると通知のイベントをあげてくれます。

そのイベントで処理するような感じですね。

 

使い方としては

①監視対象ディレクトリを指定する

②監視対象の拡張子を指定する(全てを指定する場合は空にする)

③サブディレクトリ配下も含めるか指定する

④監視する変更の種類を指定する

を指定してイベントがあがってくるのを待ち、来たら処理する感じです。

 

監視する変更の種類(NotifyFilters)

フィールド内容
Attributesファイルまたはフォルダーの属性
CreationTimeファイルまたはフォルダーが作成された時刻
DirectoryNameディレクトリの名前
FileNameファイルの名前です
LastAccessファイルまたはフォルダーを最後に開いた日付
LastWriteファイルまたはフォルダーへの最終書き込み日付
Securityファイルまたはフォルダーのセキュリティ設定
Sizeファイルまたはフォルダーのサイズ

 

サンプルでは

D:\監視DIR配下

拡張子がtxtのファイルを監視対象としています。

 

サンプルは3つの部品を使用しています。

No部品nametext
1FileSystemWatcherfileSystemWatcher1
2ButtonbtnStart監視開始
3ButtonbtnEnd監視終了

プログラミング

言語: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);

        }

    }
}

実行結果

監視開始

ファイルの作成

ファイルの変更(ファイルを開き編集し保存)

ファイル名の変更

ファイルの削除

監視終了

以上です。

それでは、また!

コメント

タイトルとURLをコピーしました