fs.watch より使える?TypeScript でファイルやフォルダの追加・変更・削除を検出する

ファイルやフォルダが作成されたタイミングや、変更・削除されたタイミングで処理を実行する要件がありましたので、Nodeモジュールで簡単にできないかと調査してみました。

1. Nodeモジュール

chokidar というモジュールを使用します。

https://www.npmjs.com/package/chokidar

2. ソース


import * as chokidar from "chokidar"
let watcher = chokidar.watch("./data/", {
    ignored:/[\\/\\\\]\./,
    persistent: true
})
watcher.add("./data2/")
watcher.add("./data3/tetete.txt")
watcher.on("ready", () => {
    console.log(ready watching ...])
    watcher.on("add", (path) => {
        console.log(added : ${path})
    })
    watcher.on("change", (path) => {
        console.log(changed : ${path})
    })
    watcher.on("unlink", (path) => {
        console.log(unlink : ${path})
    })
    watcher.on("addDir", (path) => {
        console.log(addDir : ${path})
    })
    watcher.on("unlinkDir", (path) => {
        console.log(unlinkDir : ${path})
    })
})

このソースの監視対象は以下のとおりです。

  • ./data/ 配下のすべてのファイルとフォルダ
  • ./data2/ 配下のすべてのファイルとフォルダ
  • ./data3/ 配下の tetete.txt ファイルのみ

3. 詳しい説明

  • chokidar.watch で監視対象を指定します。この例では、watcherというオブジェクトに格納しています。
  • watcher.add で監視対象を追加しています。フォルダ名だけの場合は、配下のすべてのファイル・フォルダが対象になります。ファイル名まで指定すると、そのファイルのみ監視対象になります。
  • watcher.on で監視対象がヒットした場合の処理を記述します。
    • add は、ファイルが追加されたタイミングで実行されます。
    • change は、ファイルが変更されたタイミングで実行されます。
    • unlink は、ファイルが削除されたタイミングで実行されます。
    • addDir は、フォルダが追加されたタイミングで実行されます。
    • unlinkDir は、フォルダが削除されたタイミングで実行されます。

4. 処理結果


> node .\index.js
ready watching ...
added : data\新しいテキスト ドキュメント.txt
added : data\test.txt
unlink : data\新しいテキスト ドキュメント.txt
changed : data\test.txt
unlink : data\test.txt
addDir : data2\新しいフォルダー
unlinkDir : data2\新しいフォルダー
addDir : data2\testdir1
addDir : data2\testdir1\新しいフォルダー
unlinkDir : data2\testdir1\新しいフォルダー
addDir : data2\testdir1\testdir2
added : data2\testdir1\testdir2\新しいテキスト ドキュメント.txt
added : data2\testdir1\testdir2\test3.txt
unlink : data2\testdir1\testdir2\新しいテキスト ドキュメント.txt
unlink : data2\testdir1\testdir2\test3.txt

5. fs.watch との比較

chokidar は、MacOS以外のプラットホームではfs.watchを使用しており、MacOSではDarwin FSEvents APIを使用しているそうです。

なぜかと言うと、fs.watch はすべてのプラットホームで正しく動作するわけでは無いからです。

The fs.watch API is not 100% consistent across platforms, and is unavailable in some situations
https://nodejs.org/docs/latest/api/fs.html#fs_caveats

返信を残す

メールアドレスが公開されることはありません。