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' ]
参考サイト
- readdirSync - File System | Node.js v9.7.1 Documentation
- statSync - File System | Node.js v9.7.1 Documentation
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿