1.概要
Windowsでいう【FileSystemWatcherクラス】をLinuxで実現するため
【chokidar】モジュールを使ってみました。
ファイルが作成された、変更された等のイベントをトリガとして
処理を行いたい時に便利です。
今回はタイトルにあるとおり
ファイル作成時のイベント発生ではなく
ファイル作成完了時のイベント発生を目的としています。
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でイベントが発生することになります。
大きいファイル等はこの設定を行わないと作成完了しないままイベントが発生することになるので注意が必要です。