
nodejs で動作する javascript で指定したディレクトリ(パス)の配下にあるファイルを再帰的に取得し一覧化する方法をサンプルコード付き、コピペ可能な形で備忘として記載しています。
掲載したコードは nodejs 標準の機能のみで動作します。
以下がコード例です。 指定したパス配下のファイルをサブフォルダ含めてファイル一覧として配列で取得します。
おまけで探索する深さ(フォルダの中のフォルダ・・といった構造をどれくらい深くまで探索するか) をオプション指定可能としました。
path は Windows 版で記載していますが、 Linux系やMacOS上でも問題なく動作します。
/**
* 再帰的にパス配下のファイル一覧を絶対パスの文字列で取得
* @param {string} targetpath 探索する対象のパス
* @param {number} depth 探索する深さ。オプション。デフォルトは指定なし。
* @returns 取得したファイルの絶対パスを、文字列の配列で返す
*/
var GetFilelistRecursively = ((targetpath, depth = -1) => {
let result = [];
let dirs = fs.readdirSync(targetpath);
dirs.forEach(file => {
let filepath = targetpath + "/" + file;
if ( fs.lstatSync(filepath).isDirectory()) {
if ( depth == 0 ) return result;
result = result.concat( GetFilelistRecursively(filepath, depth - 1));
} else {
result.push(filepath);
}
});
return result;
});
// 使用例
console.log( GetFilelistRecursively("C:/testdir",1) );
使用例として上のプログラムでは、パスの「c:/testdir」を指定しています。
ここから 第1階層までをファイル探索する対象(制限)とするため、第2引数に「1」を指定しています。 ファイル探索に制限なしで検索したい場合、第二引数は指定しなければOKです。
このフォルダ構成は以下になっており、取得される対象をハイライトしました。
C:\TESTDIR
├─ readme.txt
├─ lv1-image
│ ├─ magictexture.png
│ └─ emptyDir ・・・ 空のディレクトリ
└─lv2-prog
├─ 3dgame.js
├─ main.js
└─ package-database
└─ index.js
プログラムの実行結果は以下のようになります。
>node getfilelist_recursively.js
[
'C:/testdir/lv1-image/magictexture.png',
'C:/testdir/lv2-prog/3dgame.js',
'C:/testdir/lv2-prog/main.js',
'C:/testdir/readme.txt'
]
ファイルの一覧が取得できました!
指定したパス配下のディレクトリやファイルを一覧で取得し、 それぞれをプログラムで処理したいような場合があるかと思います。
その場合、以下のようなコードが使えるかと思います。
/**
* 再帰的にパス配下のファイル・フォルダ一覧を取得
* @param {string} targetpath 探索する対象のパス
* @param {number} depth 探索する深さ。オプション。デフォルトは指定なし。
* @returns 取得したファイル、ディレクトリの{path:絶対パス, isDir:ディレクトリか} を配列で返す
*/
var GetFilelistRecursively2 = ((targetpath, depth = -1) => {
let result = [];
let dirs = fs.readdirSync(targetpath);
dirs.forEach(file => {
let filepath = targetpath + "/" + file;
let isDir = fs.lstatSync(filepath).isDirectory();
result.push({path:filepath, isDir:isDir });
if ( isDir ) {
if ( depth == 0 ) return result;
result = result.concat( GetFilelistRecursively2(filepath, depth - 1));
}
});
return result;
});
// 使用例
console.log( GetFilelistRecursively2("C:/testdir",1) );
対象としたフォルダ構成は以下になっており、取得される対象をハイライトしました。
C:\TESTDIR
├─ readme.txt
├─ lv1-image
│ ├─ magictexture.png
│ └─ emptyDir <= Empty Directory
└─lv2-prog
├─ 3dgame.js
├─ main.js
└─ package-database
└─ index.js
一番深いところにある「c:\testdir\lv2-prog\package-database\index.js」を除いたほかのファイル、ディレクトリが取得対象となります。
実行結果は以下の通りです。
> node getfilelist_recursively2.js
[
{ path: 'C:/testdir/lv1-image', isDir: true },
{ path: 'C:/testdir/lv1-image/magictexture.png', isDir: false },
{ path: 'C:/testdir/lv2-prog', isDir: true },
{ path: 'C:/testdir/lv2-prog/3dgame.js',isDir: false },
{ path: 'C:/testdir/lv2-prog/main.js',isDir: false },
{ path: 'C:/testdir/readme.txt'isDir: false },
]
権限不足のフォルダやファイルを探索しようとすると例外となります。
node:internal/fs/utils:344
throw err;
^
Error: EPERM: operation not permitted, lstat 'C://$Recycle.Bin/S-1-5-18'
at Object.lstatSync (node:fs:1514:3)
at C:\02_data\getfilelist_recursively.js:27:17
エラーメッセージとして「Error: EPERM: operation not permitted, lstat XXXX」 で XXXX へのアクセスが権限不足でステータスが取得に失敗したことがわかります。
この例だとゴミ箱のディレクトリにアクセスしようとして失敗しています。
日付 | 変更概要 |
---|---|
なし |
コメント、ありがとうございます。
ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。
Twitter:@NodachiSoft_jpお名前:以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください
お名前: