Skip to content

Instantly share code, notes, and snippets.

@markhker
Forked from timoxley/1.rreaddir.js
Created February 9, 2021 02:35
Show Gist options
  • Save markhker/d7ac2336dc20119eb6d0674cc1de6580 to your computer and use it in GitHub Desktop.
Save markhker/d7ac2336dc20119eb6d0674cc1de6580 to your computer and use it in GitHub Desktop.
async/await recursive fs readdir
import { join } from 'path'
import { readdir, stat } from 'fs-promise'
async function rreaddir (dir, allFiles = []) {
const files = (await readdir(dir)).map(f => join(dir, f))
allFiles.push(...files)
await Promise.all(files.map(async f => (
(await stat(f)).isDirectory() && rreaddir(f, allFiles)
)))
return allFiles
}
// straight synchronous version for perf comparison
import { join } from 'path'
import fs from 'fs'
function rreaddirSync (dir, allFiles = []) {
const files = fs.readdirSync(dir).map(f => join(dir, f))
allFiles.push(...files)
files.forEach(f => {
fs.statSync(f).isDirectory() && rreaddirSync(f, allFiles)
})
return allFiles
}
import assert from 'assert'
console.time('parallel')
rreaddir(__dirname).then(pFiles => {
console.timeEnd('parallel')
console.time('sync')
const sFiles = rreaddirSync(__dirname)
console.timeEnd('sync')
assert.deepEqual(pFiles.sort(alpha), sFiles.sort(alpha))
})
function alpha (a, b) {
return a.localeCompare(b)
}
parallel: 313.899ms
sync: 80.259ms
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment