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

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

実践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==)

速攻でメモできる QuickNote リリースしました!

QuickNoteは動作が超軽量でサクサクかけるノートアプリです。一瞬の閃きを逃さずにノートを開き書き始めることができます。 アカウント登録も不要です。お試しあれ!

Excel操作をコマンドで! proBoarderExcel

Excelはマウスで操作するのが基本ですが、マウス操作に疲れてはいませんか? キーボードでExcel操作ができるようになるアプリです。オープンソースで無料です。

積み上げ! Daily Stack リリースしました!

Daily Stack は日々の積み上げを管理するToDoアプリです。過去の積み上げの振り返りだけでなく、ツイート機能もあります。 アカウント登録不要ですぐに使い始めることができます。

ExecNote.app リリースしました!

ExecNoteは、コードが実行できるMarkdownアプリケーションです。Markdownドキュメント内に記載したコードをクリックすると実行ができます。わざわざターミナルを 起動させる必要がありません!無料ですのでもしよければダウンロードをお願いします。

About Me

11年目のシステムエンジニアです。アプリで生活や仕事を改善したい🐱仕事効率化、自動化のアプリ開発が得意です、ご相談ください。 🚀エンタメ系アプリの開発も模索中🐬社内SEや個人アプリ開発者、システムエンジニアになりたい人と繋がりたい🐱