問題

私はすべてのディレクトリを特定のディレクトリ内で同期させたい。

 <MyFolder>
    |- Folder1
       |- Folder11
       |- Folder12
    |- Folder2
    |- File1.txt
    |- File2.txt
    |- Folder3
        |- Folder31
        |- Folder32
 

私は次の配列を取得することを期待します:

 ["Folder1/Folder11", "Folder1/Folder12", "Folder2", "Folder3/Folder31", "Folder3/Folder32"]
 

これは私のコードです:

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

function flatten(lists) {
  return lists.reduce((a, b) => a.concat(b), []);
}

function getDirectories(srcpath) {
  return fs.readdirSync(srcpath)
  .map(file => path.join(srcpath, file))
  .filter(path => fs.statSync(path).isDirectory());
}

function getDirectoriesRecursive(srcpath) {
  return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))];
}
 

誰も私が上記の問題を解決するのを助けるだろうか?

  ベストアンサー

非同期

ここでは、Nodeの高速 fs.Dirent オブジェクトを使用した高価なバージョンを示します。このアプローチでは、すべてのパスで高価なfs.existsSyncfs.statSyncの呼び出しをスキップすることができます。

 const { readdir } =
  require ("fs")

const { join } =
  require ("path")

const dirs = async (path = ".") =>
  Promise.all
    ( (await readdir (path, { withFileTypes: true }))
        .map
          ( dirent =>
              dirent .isDirectory ()
                ? dirs (join (path, dirent.name))
                : []
          )
    )
    .then
      ( results =>
          [] .concat (path, ...results)
      )
 

あなたはこれをこのように使う -

 dirs ("MyFolder") .then (console.log, console.error)
 

同期

代わりに同期関数を使用して上記の関数を書き直すことができます。

 const { readdirSync } =
  require ("fs")

const { join } =
  require ("path")

const dirsSync = (path = ".") =>
  [].concat
    ( path
    , ...readdirSync (path, { withFileTypes: true })
        .map
          ( dirent =>
              dirent .isDirectory ()
                ? dirsSync (join (path, dirent.name))
                : []
          )
    )
 

あなたはこれをこのように使う -

 console .log (dirsSync ("MyFolder"))
 

これは、Array.prototype.flatMapを使用してさらに簡略化することができます。

 const { readdirSync } =
  require ("fs")

const { join } =
  require ("path")

const dirsSync = (path = ".") =>
  [ path
  , ...readdirSync (path, { withFileTypes: true })
      .flatMap
        ( dirent =>
            dirent .isDirectory ()
              ? dirsSync (join (path, dirent.name))
              : []
        )
  ]
 

  同じタグがついた質問を見る

javascriptnode.jsrecursiondirectorypath