Nodachisoft Nodachisoft logo, Katana Sword Icon
  
@あまじ✎ 2021年12月14日に更新

nodejs で動作する javascript で指定したディレクトリ(パス)の配下にあるファイルを再帰的に取得し一覧化する

nodejs で動作する javascript で指定したディレクトリ(パス)の配下にあるファイルを再帰的に取得し一覧化する

概要

nodejs で動作する javascript で指定したディレクトリ(パス)の配下にあるファイルを再帰的に取得し一覧化する方法をサンプルコード付き、コピペ可能な形で備忘として記載しています。

掲載したコードは nodejs 標準の機能のみで動作します。

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

以下がコード例です。 指定したパス配下のファイルをサブフォルダ含めてファイル一覧として配列で取得します。

おまけで探索する深さ(フォルダの中のフォルダ・・といった構造をどれくらい深くまで探索するか) をオプション指定可能としました。

path は Windows 版で記載していますが、 Linux系やMacOS上でも問題なく動作します。

 
getfilelist_recursively.js
/**
 * 再帰的にパス配下のファイル一覧を絶対パスの文字列で取得
 * @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'
]

ファイルの一覧が取得できました!

指定したパス配下のディレクトリとファイルを区別できるように一覧で取得

指定したパス配下のディレクトリやファイルを一覧で取得し、 それぞれをプログラムで処理したいような場合があるかと思います。

その場合、以下のようなコードが使えるかと思います。

 
getfilelist_recursively2.js
/**
 * 再帰的にパス配下のファイル・フォルダ一覧を取得
 * @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) );

対象としたフォルダ構成は以下になっており、取得される対象をハイライトしました。

filesystem_structure
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」を除いたほかのファイル、ディレクトリが取得対象となります。

実行結果は以下の通りです。

Result
> 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
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

npm run スクリプトに引数を渡す方法

npm run スクリプトに引数を渡す方法

#Nodejs#Javascript✎ 2021-12-16
引数を npm run のスクリプト(npm-run-script)に渡して動的な処理をしたいことがありましたので、方法をサンプルコード付きで備忘しておきます
目次
nodejs で動作する javascript で指定したディレクトリ(パス)の配下にあるファイルを再帰的に取得し一覧化する
nodejs で動作する javascript で指定したディレクトリ(パス)の配下にあるファイルを再帰的に取得し一覧化する
概要
概要
指定したパス配下のファイル一覧を取得するコード
指定したパス配下のファイル一覧を取得するコード
指定したパス配下のディレクトリとファイルを区別できるように一覧で取得
指定したパス配下のディレクトリとファイルを区別できるように一覧で取得
利用にあたっての注意
利用にあたっての注意
参考
参考
変更履歴
変更履歴
Nodachisoft © 2021