目的のファイルやディレクトリを再帰的に辿って、ファイルのパス一覧を取得するシンプルなnode.jsを書いてみました。

globとかgulpでもファイルを読み込みできるのですが、少し勉強のために作ってみました。今回はファイルパス以外にファイルの最終変更日時や最終アクセス時刻などのファイル・システム情報を列挙できるようにしました。

環境はnode.js v0.10.xやnode.js v4.xで確認しました。Pull Requestやissueも歓迎しておりますので、ご指摘などございましたらよろしくお願いします。

目次:node.jsでディレクトリを再帰的に読み込む方法

使い方

まずはnpmインストールします。

bash
1
$ npm install node-filelist --save

使い方は以下のようになります。filesに目的のファイルパスを指定します。またoptionに読み込みたいファイルの拡張子を指定すると、その拡張子だけ限定して読み込むことができます。

index.js
1
2
3
4
5
6
7
8
9
10
var fl      = require('node-filelist');
var files = [ "/path-you-want-to-read" ]; //読み込みたいファイルディレクトリまたはパス(配列なので複数指定可)
var option = { "ext" : "jpeg|jpg|png|gif" }; //読み込みたいファイルの拡張子(指定がない場合は全てのファイルを読み込みます)

fl.read(files, option , function (results){
for(var i = 0; i < results.length; i++){
console.log(results[i].path);
// console.log(results[i].stats.mtime); // ファイルの最終変更日時や最終アクセス時刻を取得したいときは , option.isStats を有効にする.
}
});

結果はこのような感じになります。

bash
1
2
3
4
5
6
$ node index.js
/path-you-want-to-read/sample-1.jpg
/path-you-want-to-read/example-dir/sample-2.jpg
/path-you-want-to-read/sample-3.png
/path-you-want-to-read/sample-4.gif
...

fs.statsで取得できるもの

出力に含まれるstatsfs.statsの返り値をそのまま渡しています。statsの中身はあまり馴染みが無かったのですが、ファイルの更新日時などの情報が入っています。そのほか、node.jsのドキュメントを見ると以下の様なものがあります。

Documentation - node.js
fs.stats

ドキュメントを見てもいまちちピンとこなかったので、以下を参考にしました。

kazmax Linuxで自宅サーバー
stat - システムコールの説明 - Linux コマンド集 一覧表

上記を読むと以下のように対応してる事が分かりました。

fs.statsの返り値 説明
dev ファイルがあるデバイスの ID
ino inode 番号
mode アクセス保護
nlink ハードリンクの数
uid 所有者のユーザ ID
gid 所有者のグループ ID
rdev デバイス ID (特殊ファイルの場合)
size 全体のサイズ (バイト単位)
blksize ファイルシステム I/O でのブロックサイズ
blocks 割り当てられたブロック数
atime 最終アクセス時刻
mtime 最終修正時刻
ctime 最終状態変更時刻
birthtime ファイル作成時刻(おそらく)

ということで、ファイルシステムの情報を調べたい時に有益なメソッドのようです。

参考にさせて頂いた記事

ディレクトリを辿る方法は以下が参考になりました。ディレクトリなら再帰、ファイルならコールバックを呼ぶというのがとても勉強になりました。

Experiments Never Fail
ディレクトリを再帰的にたどってファイル一覧を出力する

試しに、ネストしまくっているnode_mouduleを含むプロジェクトを読ませてみましたが、2万ファイル辺りでスタックオーバーフローしてしまいました。エラーメッセージはこんな感じです。

bash
1
RangeError: Maximum call stack size exceeded

スタックオーバーフローに関しては、こちらの記事が大変参考になりました(^^;)非同期処理は難しい…

Nao Minami’s Blog
JavaScriptでスタックオーバーフローを起こさない方法

statsの情報はfs.watch()fs.watchFile()のような更新ファイルを探す処理を自前で実装するためにも使える情報だと思いました。この2つのメソッドは非常にややこしい動作をしているので、過去にうまくファイル監視が動作しなかったりと悩まされた事がありました。しかし、ファイル全てのstatsの情報を突き合わせれば確実にファイル監視が行えるので、とても助かっています。