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

File system | Node.js v20.3.0 Documentation

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

実践TypeScript【電子書籍】[ 吉井健文 ]
価格:3726円 (2019/7/23時点)

[

楽天で購入

](https://hb.afl.rakuten.co.jp/hgc/18648e8b.7d833591.18648e8c.ed1bab3c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Frakutenkobo-ebooks%2F5456816fd8833397a6aa8b80647873ad%2F%3Fscid%3Daf_pc_bbtn&m=http%3A%2F%2Fm.rakuten.co.jp%2Frakutenkobo-ebooks%2Fi%2F18341447%2F%3Fscid%3Daf_pc_bbtn&link_type=picttext&ut=eyJwYWdlIjoiaXRlbSIsInR5cGUiOiJwaWN0dGV4dCIsInNpemUiOiIyNDB4MjQwIiwibmFtIjoxLCJuYW1wIjoicmlnaHQiLCJjb20iOjEsImNvbXAiOiJkb3duIiwicHJpY2UiOjEsImJvciI6MSwiY29sIjoxLCJiYnRuIjoxfQ==)

コメント

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