2018/03/08

[Node.js]指定したパス配下(サブディレクトリ含む)のファイル一覧を取得する

Node.jsで指定したパスにどんなファイルがあるか一覧にしたいのだが、そんな都合の良いメソッドはなかった。fs.readdirSync(path, { recursive: true })なんてオプションがあったら便利なのに。

ということで、パス一覧を取得する方法を紹介する。

環境は以下のとおり。

  • Node@7.6+
    • fs.readdirSyncとfs.statSyncが使えるバージョンならOK


パス一覧を取得する


const path = require('path');
const fs = require('fs');

const target = 'target';
const dirPath = path.resolve(__dirname, target);

const list = fs.readdirSync(dirPath);
list.forEach(console.log);


fs.readdirSyncを使うことで指定したディレクトリにあるファイル/ディレクトリのリストが取得できる。サブディレクトリもすべてチェックする場合は、これを再帰処理で呼び出せば良い。



指定したパス配下のファイル一覧を取得する


サブディレクトリ配下も含むすべてのファイル一覧を取得する。
const path = require('path');
const fs = require('fs');

// ファイルタイプの列挙体(のつもり)
const FileType = {
  File: 'file',
  Directory: 'directory',
  Unknown: 'unknown'
}

/**
 * ファイルの種類を取得する
 * @param {string} path パス
 * @return {FileType} ファイルの種類
 */
const getFileType = path => {
  try {
    const stat = fs.statSync(path);

    switch (true) {
      case stat.isFile():
        return FileType.File;

      case stat.isDirectory():
        return FileType.Directory;

      default:
        return FileType.Unknown;
    }

  } catch(e) {
    return FileType.Unknown;
  }
}

/**
 * 指定したディレクトリ配下のすべてのファイルをリストアップする
 * @param {string} dirPath 検索するディレクトリのパス
 * @return {Array<string>} ファイルのパスのリスト
 */
const listFiles = dirPath => {
  const ret = [];
  const paths = fs.readdirSync(dirPath);

  paths.forEach(a => {
    const path = `${dirPath}/${a}`;

    switch (getFileType(path)) {
      case FileType.File:
        ret.push(path);
        break;

      case FileType.Directory:
        ret.push(...listFiles(path));
        break;

      default:
        /* noop */
    }
  })

  return ret;
};

const dirPath = path.resolve(__dirname, 'target');
const list = listFiles(dirPath);

console.log(list);

fs.statSyncでファイルのタイプ(ファイル or ディレクトリ)を判定し、ディレクトリなら再帰的にディレクトリ内の一覧を取得するというプログラム。
Node.jsではEnumが使えないので、オブジェクトリテラルで対応している。


たとえば、以下のようなディレクトリ階層だった場合。
target/
├── aaa
│   ├── b1.file
│   ├── b2.txt
│   ├── b3.js.txt
│   └── bbb
│       ├── ccc
│       │   └── ddd
│       │       └── eee.file
│       └── ccc.file
└── aaa.file


先ほどのプログラムを実行すると、ファイルの一覧が取得できる。
[ '/Users/rikko/target/aaa/b1.file',
  '/Users/rikko/target/aaa/b2.txt',
  '/Users/rikko/target/aaa/b3.js.txt',
  '/Users/rikko/target/aaa/bbb/ccc/ddd/eee.file',
  '/Users/rikko/target/aaa/bbb/ccc.file',
  '/Users/rikko/target/aaa.file' ]



参考サイト






以上

written by @bc_rikko

0 件のコメント :

コメントを投稿