中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【node.js】chokidarでファイル作成が完了してからイベントを発生させる

1.概要

Windowsでいう【FileSystemWatcherクラス】をLinuxで実現するため
【chokidar】モジュールを使ってみました。


ファイルが作成された、変更された等のイベントをトリガとして
処理を行いたい時に便利です。


今回はタイトルにあるとおり
ファイル作成時のイベント発生ではなく
ファイル作成完了時のイベント発生を目的としています。


2.インストール

インストールはお決まりで、下記のとおりです。

>npm install chokidar

詳細は下記を参照
github.com


3.chokidarで捕捉できるイベント

イベント名 内容
add ファイルの追加
change ファイルの変更
unlink ファイルの削除
addDir ディレクトリの追加
unlinkDir ディレクトリの削除
error chokidarのエラー
ready chokidarの初期化完了

4.スクリプト

実際のスクリプトが下記になります。

let chokidar = require("chokidar");

// 監視対象のディレクトリ、オプションを指定し開始
let testWatcher = chokidar.watch("/home/testuser/", {
    ignored: /[\/\\]\./,
    persistent: true,
    depth: 0,
    awaitWriteFinish: true
});

testWatcher.on('ready', function () {
    testWatcher.on('add', function (path, stats) {
        logger.info(`File uploaded. [${path}]`);
        // 処理を記載
        
    });

    testWatcher.on('error', function (path) {
        logger.error(`Upload watcher error: ${error}`);
    });
});

5.解説

【awaitWriteFinish】を【true】に変更することで
ファイル作成完了時にイベントを発生させることができます。


ファイル作成完了をどのようにWatchしているかというと

ファイルサイズを定期的にポーリングし、ファイルサイズに変更がなくなった時
にイベントを発生させているようです。


ポーリング間隔とファイルサイズに変更がなくなってから何秒後にイベントを発生させるかは
下記のように細かく設定することが可能です。

awaitWriteFinish: {
    stabilityThreshold: 2000,
    pollInterval: 100
}

上記はデフォルト値ですが
100msでポーリングを行い、ファイルサイズに変更がなくなってから2000msでイベントが発生することになります。


大きいファイル等はこの設定を行わないと作成完了しないままイベントが発生することになるので注意が必要です。