Node.jsでフォルダーの変更を監視してファイルパスを出力する方法
Node.js でフォルダーの変更を監視し、変更されたファイルパスを出力する
必要なもの
- Node.js
chokidar
npmパッケージ
手順
chokidar
パッケージをインストールします。
npm install chokidar
- 以下のコードを
index.js
ファイルに保存します。
const chokidar = require('chokidar');
const watcher = chokidar.watch('path/to/folder');
watcher.on('add', (path) => {
console.log(`File added: ${path}`);
});
watcher.on('change', (path) => {
console.log(`File changed: ${path}`);
});
watcher.on('delete', (path) => {
console.log(`File deleted: ${path}`);
});
- コードを実行します。
node index.js
- 監視対象のフォルダーにファイルを 追加、変更、削除 すると、コンソールにファイルパスが出力されます。
コードの説明
chokidar
パッケージは、Node.js用のファイルシステム監視ライブラリです。chokidar.watch()
関数は、監視対象のフォルダーを指定します。watcher.on()
メソッドは、ファイルシステムイベント (追加、変更、削除) が発生したときに実行されるコールバック関数を定義します。- コールバック関数には、変更されたファイルのパスが引数として渡されます。
応用例
このプログラムは、以下のような様々な目的に使用できます。
- ファイルが変更されたときに自動的にタスクを実行する (例:ファイルをコンパイルする、テストを実行する)
- ファイルシステムの変更をログに記録する
- ファイル共有アプリケーションでファイルの変更を同期する
- 監視対象のフォルダーとサブフォルダーをすべて監視するには、
{ recursive: true }
オプションをchokidar.watch()
関数に渡します。 - 特定のファイルタイプの変更のみを監視するには、
chokidar.watch()
関数の第2引数にファイルマスクを指定します。 - 複数のフォルダーを監視するには、
chokidar.watch()
関数を複数回呼び出します。
const chokidar = require('chokidar');
const watcher = chokidar.watch('path/to/folder', {
ignored: '**/node_modules/**', // 'node_modules' フォルダとそのサブフォルダーを無視
});
watcher.on('add', (path) => {
console.log(`File added: ${path}`);
});
watcher.on('change', (path) => {
console.log(`File changed: ${path}`);
});
watcher.on('delete', (path) => {
console.log(`File deleted: ${path}`);
});
このコードの説明:
chokidar.watch()
関数を使用して、監視対象のフォルダーを指定します。- この例では、
path/to/folder
フォルダーを監視します。 ignored
オプションを使用して、node_modules
フォルダとそのサブフォルダーを監視対象から除外しています。
- この例では、
watcher.on()
メソッドを使用して、ファイルシステムイベントが発生したときのコールバック関数を定義します。add
イベント: ファイルが追加されたときに実行されます。
サンプルコードの使用方法:
- ターミナルで以下のコマンドを実行して、コードを実行します。
node index.js
補足:
- このコードはあくまで基本的な例です。必要に応じて、自由にカスタマイズしてください。
Node.jsでフォルダーの変更を監視する方法:代替アプローチ
fs.watchFileとfs.readdir/fs.statの組み合わせ
この方法は、Node.jsの標準ライブラリにある fs
モジュールを使用します。
const fs = require('fs');
function watchFolder(path) {
fs.readdir(path, (err, files) => {
if (err) return console.error(err);
files.forEach(file => {
const filePath = path + '/' + file;
fs.stat(filePath, (err, stats) => {
if (err) return console.error(err);
console.log(`File: ${filePath} - Last modified: ${stats.mtime}`);
fs.watchFile(filePath, (curr, prev) => {
if (curr.mtime !== prev.mtime) {
console.log(`File changed: ${filePath}`);
}
});
});
});
});
}
watchFolder('path/to/folder');
説明:
fs.readdir()
関数を使用して、監視対象フォルダー内のファイルをすべて取得します。- 各ファイルに対して、
fs.stat()
関数を使用して、ファイルのステータス情報 (例:最終更新日時) を取得します。 fs.watchFile()
関数を使用して、個々のファイルを監視し、ファイルが変更されたらコンソールにログを出力します。
利点:
- 軽量で、外部ライブラリを必要としません。
- 複数のフォルダーを監視するには、コードを複製する必要があります。
- ファイルシステムイベントの処理が複雑になる可能性があります。
- 変更されたファイルの詳細な情報 (例:追加、削除) を取得できません。
node-watcherライブラリ
この方法は、node-watcher
というnpmパッケージを使用します。
const Watcher = require('node-watcher');
const watcher = new Watcher('path/to/folder');
watcher.on('change', (event) => {
console.log(`File ${event.type}: ${event.file}`);
});
watcher.start();
new Watcher()
コンストラクターを使用して、監視対象フォルダーを指定します。watcher.on('change')
イベントリスナーを使用して、ファイルシステムイベントが発生したときに実行されるコールバック関数を定義します。watcher.start()
メソッドを使用して、フォルダー監視を開始します。
- 使いやすいAPI
- 外部ライブラリが必要となります。
上記以外にも、以下のライブラリを使用してフォルダーの変更を監視することができます。
最適な方法の選び方
使用する方法は、ニーズと好みにより異なります。
- 軽量でシンプルな方法が必要な場合は、
fs.watchFile
とfs.readdir/fs.stat
の組み合わせがおすすめです。 - 使いやすく、詳細な情報が必要な場合は、
node-watcher
のようなライブラリを使用することをおすすめします。 - 特定の機能が必要な場合は、他のライブラリを調査してみてください。
どの方法を選択する場合でも、コードをテストして、正しく動作することを確認することが重要です。
node.js