目的のファイルやディレクトリを再帰的に辿って、ファイルのパス一覧を取得するシンプルなnode.jsを書いてみました。
glob
とかgulp
でもファイルを読み込みできるのですが、少し勉強のために作ってみました。今回はファイルパス以外にファイルの最終変更日時や最終アクセス時刻などのファイル・システム情報を列挙できるようにしました。
環境はnode.js v0.10.xやnode.js v4.xで確認しました。Pull Requestやissueも歓迎しておりますので、ご指摘などございましたらよろしくお願いします。
目次:node.jsでディレクトリを再帰的に読み込む方法
使い方
まずはnpmインストールします。
bash1
| $ npm install node-filelist --save
|
使い方は以下のようになります。files
に目的のファイルパスを指定します。またoption
に読み込みたいファイルの拡張子を指定すると、その拡張子だけ限定して読み込むことができます。
index.js1 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); } });
|
結果はこのような感じになります。
bash1 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で取得できるもの
出力に含まれるstats
はfs.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万ファイル辺りでスタックオーバーフローしてしまいました。エラーメッセージはこんな感じです。
bash1
| RangeError: Maximum call stack size exceeded
|
スタックオーバーフローに関しては、こちらの記事が大変参考になりました(^^;)非同期処理は難しい…
Nao Minami’s Blog
JavaScriptでスタックオーバーフローを起こさない方法
statsの情報はfs.watch()
やfs.watchFile()
のような更新ファイルを探す処理を自前で実装するためにも使える情報だと思いました。この2つのメソッドは非常にややこしい動作をしているので、過去にうまくファイル監視が動作しなかったりと悩まされた事がありました。しかし、ファイル全てのstatsの情報を突き合わせれば確実にファイル監視が行えるので、とても助かっています。