情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでフォルダの変更を再帰的に監視する

ファイルやフォルダの変更を再帰的に監視するにはchokidarモジュールのchokidar.watch関数を使用します。

var chokidar = require('chokidar');

var fsw = chokidar.watch('xxx', {
    persistent: true, 
    ignored: function (p, stats) {
        return true;
        //or
        return false;
    }, 
    ignoreInitial: false, 
     followSymlinks: true, 
    cwd: 'yyy', 
    usePolling: false, 
    interval: 100, 
    binaryInterval: 300, 
    alwaysStat: false, 
    depth: undefined, 
    awaitWriteFinish: {
        stabilityThreshold: 2000, 
        pollInterval: 100
    }, 
    ignorePermissionErrors: false, 
    atomic: true
});

第1引数にファイルやフォルダのパスを指定します。あるいは、globパターンを指定することもできます。あるいは、ファイルやフォルダのパスやglobパターンの配列を指定することもできます。

第2引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

主なオプションには下のようなものがあります。

  • persistent・・・監視を続けている間プロセスを終了しないかを真偽値として指定します。デフォルトはtrueです。
  • ignored・・・監視対象から外すファイルやフォルダのパスを指定します。あるいは、globパターンや正規表現や関数を指定することもできます。あるいは、ファイルやフォルダのパスやglobパターンや正規表現や関数の配列を指定することもできます。この関数は監視対象の候補となっている1つのファイルやフォルダに対して2回呼び出され、1回目の呼び出しの第1引数はファイルやフォルダのパスであり、2回目の呼び出しの第1引数は1回目の呼び出しの第1引数と同じであり、第2引数はファイルやフォルダに関する情報を表すfs.Statsクラスのインスタンスです。この関数では返り値としてファイルやフォルダを監視対象から外すかを真偽値として返すようにします。
  • ignoreInitial・・・ファイルやフォルダの監視開始時にaddイベントやaddDirイベントを発生させないかを真偽値として指定します。デフォルトはfalseです。
  • followSymlinks・・・シンボリックリンクを監視する場合にシンボリックリンクの参照先のファイルやフォルダも再帰的に監視するかを真偽値として指定します。デフォルトはtrueです。
  • cwd・・・パスの基準となるフォルダのパスを指定します。
  • usePolling・・・ポーリングによるファイルの監視を行うかを真偽値として指定します。ポーリングによるファイルの監視はCPUに負荷が掛かりますので注意してください。デフォルトはfalseです。
  • interval・・・ポーリングの間隔をミリ秒単位で指定します。usePollingオプションがfalseである場合には無視されます。デフォルトは100です。
  • binaryInterval・・・バイナリファイルに対するポーリングの間隔をミリ秒単位で指定します。usePollingオプションがfalseである場合には無視されます。デフォルトは300です。
  • alwaysStat・・・addイベントやaddDirイベントやchangeイベントのイベントハンドラの第2引数として必ずファイルやフォルダに関する情報を表すfs.Statsクラスのインスタンスが得られるようにするかを真偽値として指定します。デフォルトはfalseです。
  • depth・・・監視における再帰の最大深さを指定します。デフォルトはundefinedです。
  • awaitWriteFinish・・・ファイルに対する変更が完了したと思われるまでaddイベントやchangeイベントの発生を遅らせるかを真偽値として指定します。あるいは、オブジェクトを指定することもできます。オブジェクトのstabilityThresholdプロパティにはファイルに対する変更が完了したと判断するまでの時間をミリ秒単位で指定し、pollIntervalプロパティにはファイルに対する変更が完了したかを確認する間隔をミリ秒単位で指定します。デフォルトはfalseです。また、stabilityThresholdプロパティのデフォルトは2000であり、pollIntervalプロパティのデフォルトは100です。
  • ignorePermissionErrors・・・読み込み権限のないファイルやフォルダを監視するかを真偽値として指定します。デフォルトはfalseです。
  • atomic・・・同じファイルの削除と新規作成をファイルの内容の変更と見做すかを真偽値として指定します。あるいは、ファイルの内容の変更と見做すファイルの削除と新規作成の最大間隔をミリ秒単位で指定することもできます。trueを指定した場合にはファイルの削除から新規作成までの間隔が100ミリ秒以下である場合にその削除と新規作成はファイルの内容の変更と見做します。デフォルトはtrueです。

返り値としてファイルやフォルダの監視状態を表すchokidar.FSWatcherクラスのインスタンスが得られます。

fsw.add('xxx');
fsw.unwatch('xxx');
fsw.close();
var list = fsw.getWatched();
fsw.on('add', function (p, stats) {
});
fsw.on('addDir', function (p, stats) {
});
fsw.on('change', function (p, stats) {
});
fsw.on('unlink', function (p) {
});
fsw.on('unlinkDir', function (p) {
});
fsw.on('all', function (name, p) {
});
fsw.on('ready', function () {
});
fsw.on('error', function (err) {
});

このインスタンスは下のような関数を有します。

  • add・・・監視対象のファイルやフォルダを追加します。第1引数にファイルやフォルダのパスを指定します。あるいは、globパターンを指定することもできます。あるいは、ファイルやフォルダのパスやglobパターンの配列を指定することもできます。
  • unwatch・・・監視対象のファイルやフォルダを削除します。第1引数にファイルやフォルダのパスを指定します。あるいは、globパターンを指定することもできます。あるいは、ファイルやフォルダのパスやglobパターンの配列を指定することもできます。
  • close・・・監視を終了します。
  • getWatched・・・監視対象のファイルやフォルダのリストをオブジェクトとして取得します。監視対象のフォルダのパスがプロパティ名となり、そのフォルダの直下の監視対象のファイルのパスの配列がプロパティの値となります。

また、このインスタンスからは下のようなイベントが発生します。

  • add・・・ファイルが新規作成された場合に発生します。このイベントのイベントハンドラの第1引数はファイルのパスであり、第2引数はファイルに関する情報を表すfs.Statsクラスのインスタンスです。
  • addDir・・・フォルダが新規作成された場合に発生します。このイベントのイベントハンドラの第1引数はフォルダのパスであり、第2引数はフォルダに関する情報を表すfs.Statsクラスのインスタンスです。
  • change・・・ファイルの内容が変更された場合に発生します。このイベントのイベントハンドラの第1引数はファイルのパスであり、第2引数はファイルに関する情報を表すfs.Statsクラスのインスタンスです。
  • unlink・・・ファイルが削除された場合に発生します。このイベントのイベントハンドラの第1引数はファイルのパスです。
  • unlinkDir・・・フォルダが削除された場合に発生します。このイベントのイベントハンドラの第1引数はフォルダのパスです。
  • all・・・addイベント、addDirイベント、changeイベント、unlinkイベント、unlinkDirイベントが発生した場合に発生します。このイベントのイベントハンドラの第1引数は元のイベントの名称であり、第2引数はファイルやフォルダのパスです。
  • ready・・・監視が開始された時に発生します。
  • error・・・エラーイベントです。

サンプルコード1

現在のフォルダの変更を再帰的に監視します。

chokidar-watch.js

var chokidar = require('chokidar');

var fsw = chokidar.watch('.', {
    ignoreInitial: true
});
fsw.on('all', function (name, p) {
    console.log(name + ': ' + p)
});
fsw.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • Chokidar
    npm install chokidarでインストールします。

実行結果

コードを実行すると現在のフォルダの変更の監視が開始します。

C:\work\node>node chokidar-watch.js

folderというフォルダを新規作成すると変更が検出されます。

C:\work\node>mkdir folder
C:\work\node>node chokidar-watch.js
addDir: folder

folder\textfile.txtというファイルを新規作成すると変更が検出されます。

C:\work\node>echo this is text file. > folder\textfile.txt
C:\work\node>node chokidar-watch.js
addDir: folder
add: folder\textfile.txt

folder\textfile.txtの内容を変更すると変更が検出されます。

C:\work\node>echo this is text file modified. > folder\textfile.txt
C:\work\node>node chokidar-watch.js
addDir: folder
add: folder\textfile.txt
change: folder\textfile.txt

folder\textfile.txtを削除すると変更が検出されます。

C:\work\node>del folder\textfile.txt
C:\work\node>node chokidar-watch.js
addDir: folder
add: folder\textfile.txt
change: folder\textfile.txt
unlink: folder\textfile.txt

folderを削除すると変更が検出されます。

C:\work\node>rmdir folder
C:\work\node>node chokidar-watch.js
addDir: folder
add: folder\textfile.txt
change: folder\textfile.txt
unlink: folder\textfile.txt
unlinkDir: folder

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js