at backyard

Color my life with the chaos of trouble.

Node.jsでファイルを再帰的に探索してから最後に指定の処理を実行するサンプル

Node.jsでファイルを再帰的に探索する際、投げっぱなしの処理はすぐに書けたが、投げっぱなしではなくすべてのファイルの探索を終了したあとで特定の処理を行いたいとなったときにどうすれば良いのか調べてみたので、そちらの内容をメモする。

色々と考えてみたものの結局非同期関数として処理を行い、 Promise.then の中で特定の処理を実行するという形に収まった。
これが最適な答えかと問われると自身がない。
(もし良いやり方があればアドバイスください)

const { readdir } = require('fs/promises');
const path = require('path');

const showFiles = async (dirpath, callback) => {
  try {
    const dirents = await readdir(dirpath, { withFileTypes: true });

    for (const dirent of dirents) {
      const fp = path.join(dirpath, dirent.name);

      if (dirent.isDirectory()) {
        await showFiles(fp, callback);
      } else {
        callback(fp);
      }
    }
  } catch (err) {
    console.error(err);
    return;
  }

  return 'finish: 1';
};

(async () => {
  showFiles(process.argv[2], console.log)
    .then((r) => console.log(r))
    .catch((err) => console.log(err));

  console.log('finish: 2')
})();

こちらの処理を実行すると、実行結果は下記のようになる。

finish: 2
・
・(ファイルパスが表示される)

finish: 1