情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでフォルダの配下にあるファイルやフォルダのリストを再帰的に取得する

フォルダの配下にあるファイルやフォルダのリストを再帰的に取得するにはklawモジュールのklaw関数やfs-extraモジュールのfsExtra.walk関数を使用します。

var klaw = require('klaw');

var rs = klaw('xxx', {
    queueMethod: 'shift', 
    pathSorter: function (a, b) {
        return -1;
        //or
        return 0;
        //or
        return 1;
    }, 
    fs: require('fs'), 
    filter: function (element, index, array) {
        return true;
        //or
        return false;
    }
});
var fsExtra = require('fs-extra');

var rs = fsExtra.walk('xxx', {
    queueMethod: 'shift', 
    pathSorter: function (a, b) {
        return -1;
        //or
        return 0;
        //or
        return 1;
    }, 
    fs: require('fs'), 
    filter: function (element, index, array) {
        return true;
        //or
        return false;
    }
});

第1引数にフォルダのパスを指定します。

第2引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

オプションには下のようなものがあります。

  • queueMethod・・・ファイルやフォルダをどのような順序で取得するかを指定します。shiftpopを指定します。shiftは通常の順序を表し、popは通常の順序とは逆の順序を表します。デフォルトはshiftです。
  • pathSorter・・・ファイルやフォルダをソートするためのファイルやフォルダの比較処理を関数として指定します。この関数の第1引数と第2引数は比較を行う2つのファイルやフォルダのパスです。この関数では返り値として第1引数と第2引数の2つのファイルやフォルダのパスの比較結果を数値として返すようにします。返り値の数値が-1以下である場合には第1引数のファイルやフォルダのパスの方が第2引数のファイルやフォルダのパスより小さいことを表し、1以上である場合には大きいことを表し、0である場合には等しいことを表します。デフォルトはundefinedです。
  • fs・・・ファイルシステムを操作するための関数を提供しているモジュールを指定します。このモジュールはfsモジュールと同等の機能を有していなければなりません。デフォルトはfsモジュール(require('fs'))です。
  • filter・・・ファイルやフォルダのフィルタ条件を関数として指定します。この関数の第1引数はファイルやフォルダのパスです。この関数では返り値としてファイルやフォルダがフィルタ条件を満たしているかを真偽値として返すようにします。フォルダがフィルタされた場合にはそのフォルダの配下のファイルやフォルダが取得されることはありませんので注意してください。

返り値として読み込みストリームが得られます。この読み込みストリームのデータはファイルやフォルダを表すオブジェクトとなります。このオブジェクトは下のようなプロパティを有します。

  • path・・・ファイルやフォルダのパスです。
  • stats・・・ファイルやフォルダに関する情報を表すfs.Statsクラスのインスタンスです。

サンプルコード1

3つ目のコマンドライン引数として与えられたフォルダの配下にある拡張子が.ejsのファイルのリストを再帰的に取得し、標準出力にパスとサイズと作成日時を出力します。

なお、ストリームの処理のためにconcatStream関数とpump関数を使用しています。

klaw.js

var klaw = require('klaw');
var path = require('path');
var concatStream = require('concat-stream');
var pump = require('pump');

pump(klaw(process.argv[2]), concatStream(function (data) {
    for (var i = 0; i < data.length; i++) {
        if (path.extname(data[i].path) === '.ejs') {
            console.log({ path: data[i].path, size: data[i].stats.size, birthtime: data[i].stats.birthtime });
        }
    }
}), function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
});

使用パッケージ

  • klaw
    npm install klawでインストールします。
  • concat-stream
    npm install concat-streamでインストールします。
  • pump
    npm install pumpでインストールします。

実行結果

C:\work\node>node klaw.js aqua
{ path: 'C:\\work\\node\\aqua\\agg.ejs',
  size: 778,
  birthtime: 2016-10-04T05:25:59.196Z }
{ path: 'C:\\work\\node\\aqua\\aggzero.ejs',
  size: 235,
  birthtime: 2016-10-04T05:25:59.198Z }
{ path: 'C:\\work\\node\\aqua\\map.ejs',
  size: 1716,
  birthtime: 2016-10-04T05:25:59.201Z }
{ path: 'C:\\work\\node\\aqua\\mapzero.ejs',
  size: 127,
  birthtime: 2016-10-04T05:25:59.194Z }
{ path: 'C:\\work\\node\\aqua\\page\\template\\page.ejs',
  size: 409,
  birthtime: 2016-10-04T11:36:48.410Z }
{ path: 'C:\\work\\node\\aqua\\page\\template\\submit.ejs',
  size: 85,
  birthtime: 2016-10-04T11:36:48.410Z }
{ path: 'C:\\work\\node\\aqua\\page\\template\\text.ejs',
  size: 218,
  birthtime: 2016-10-04T11:36:48.410Z }
{ path: 'C:\\work\\node\\aqua\\page\\template\\textarea.ejs',
  size: 219,
  birthtime: 2016-10-05T07:33:24.705Z }
{ path: 'C:\\work\\node\\aqua\\website\\template\\router_use.ejs',
  size: 53,
  birthtime: 2016-10-05T10:19:14.190Z }

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js