◆ ディレクトリツリーをオブジェクトで取得する関数

Node.js でフォルダの中のファイル一覧やフォルダ一覧がほしいときってちょっと面倒で毎回ググってます
いいかげん使いまわせる便利な関数でもつくろう と思ったので作ってみました



使い方サンプル

パスを指定すればそこ以下のツリー構造のオブジェクトが返って来ます
> getDirectoryTree("/home/user0/.nodebrew/node")
{ 'v5.5.0':
   { '': '/home/user0/.nodebrew/node/v5.5.0',
     'CHANGELOG.md': '/home/user0/.nodebrew/node/v5.5.0/CHANGELOG.md',
     LICENSE: '/home/user0/.nodebrew/node/v5.5.0/LICENSE',
     'README.md': '/home/user0/.nodebrew/node/v5.5.0/README.md',
     bin:
      { '': '/home/user0/.nodebrew/node/v5.5.0/bin',
        node: '/home/user0/.nodebrew/node/v5.5.0/bin/node',
        nodebrew: '/home/user0/.nodebrew/nodebrew',
        npm: '/home/user0/.nodebrew/node/v5.5.0/lib/node_modules/npm/bin/npm-cli.js' },
     include:
      { '': '/home/user0/.nodebrew/node/v5.5.0/include',
        node: [Object] },
     lib:
      { '': '/home/user0/.nodebrew/node/v5.5.0/lib',
        node_modules: [Object] },
     share:
      { '': '/home/user0/.nodebrew/node/v5.5.0/share',
        doc: [Object],
        man: [Object],
        systemtap: [Object] } },
  'v6.9.1':
   { '': '/home/user0/.nodebrew/node/v6.9.1',
……

コンソールでは非表示ですが ちゃんと最下層まで存在します
> var tree = getDirectoryTree("/home/user0/.nodebrew/node")
> tree["v7.1.0"].include.node["v8.h"]
'/home/user0/.nodebrew/node/v7.1.0/include/node/v8.h'

tree コマンドによると このフォルダ以下には 1676 フォルダ 7094 ファイル が存在するらしいです
それでも ちょっと待ち時間あると感じますが 1 秒もかかるかどうかくらいです


二つ目の引数にオプションをつけられます
> getDirectoryTree("/home/user0/.nodebrew/node", {max_depth: 1})
{ 'v5.5.0': { '': '/home/user0/.nodebrew/node/v5.5.0' },
  'v6.9.1': { '': '/home/user0/.nodebrew/node/v6.9.1' },
  'v7.1.0': { '': '/home/user0/.nodebrew/node/v7.1.0' } }
> getDirectoryTree("/home/user0/.nodebrew/node", {file: false})
{ 'v5.5.0':
   { '': '/home/user0/.nodebrew/node/v5.5.0',
     bin: { '': '/home/user0/.nodebrew/node/v5.5.0/bin' },
     include:
      { '': '/home/user0/.nodebrew/node/v5.5.0/include',
        node: [Object] },
     lib:
      { '': '/home/user0/.nodebrew/node/v5.5.0/lib',
        node_modules: [Object] },
     share:
      { '': '/home/user0/.nodebrew/node/v5.5.0/share',
        doc: [Object],
        man: [Object],
        systemtap: [Object] } },
  'v6.9.1':
   { '': '/home/user0/.nodebrew/node/v6.9.1',
     bin: { '': '/home/user0/.nodebrew/node/v6.9.1/bin' },
     include:
      { '': '/home/user0/.nodebrew/node/v6.9.1/include',
        node: [Object] },
     lib:
……

max_depth でどれだけ再帰的にフォルダを見るか制限できます
デフォルトは無制限です
指定したフォルダの中だけ見るなら 1 を指定します

file, dir を false にすると ファイルは無視 フォルダは無視になります

dir: false だとフォルダは無視されるので max_depth: 1 になります


またパスの配列だけをほしいときには flatten: true を指定します
> getDirectoryTree("/home/user0/.nodebrew/node", {flatten: true, max_depth: 2})
[ '/home/user0/.nodebrew/node/v5.5.0',
  '/home/user0/.nodebrew/node/v5.5.0/CHANGELOG.md',
  '/home/user0/.nodebrew/node/v5.5.0/LICENSE',
  '/home/user0/.nodebrew/node/v5.5.0/README.md',
  '/home/user0/.nodebrew/node/v5.5.0/bin',
  '/home/user0/.nodebrew/node/v5.5.0/include',
  '/home/user0/.nodebrew/node/v5.5.0/lib',
  '/home/user0/.nodebrew/node/v5.5.0/share',
  '/home/user0/.nodebrew/node/v6.9.1',
  '/home/user0/.nodebrew/node/v6.9.1/CHANGELOG.md',
  '/home/user0/.nodebrew/node/v6.9.1/LICENSE',
  '/home/user0/.nodebrew/node/v6.9.1/README.md',
  '/home/user0/.nodebrew/node/v6.9.1/bin',
  '/home/user0/.nodebrew/node/v6.9.1/include',
  '/home/user0/.nodebrew/node/v6.9.1/lib',
  '/home/user0/.nodebrew/node/v6.9.1/share',
  '/home/user0/.nodebrew/node/v7.1.0',
  '/home/user0/.nodebrew/node/v7.1.0/CHANGELOG.md',
……

フォルダとファイルの区別はできなくなります
フォルダの場合は最後に / 入れたほうがいいかな?

注意

最後に注意点

全部同期処理 (Sync 付き) なので web サーバとか非同期にすべき場所で使うには 向きません