diff --git a/lib/copy/copy-sync.js b/lib/copy/copy-sync.js index 8bc60119..40b29793 100644 --- a/lib/copy/copy-sync.js +++ b/lib/copy/copy-sync.js @@ -106,7 +106,17 @@ function mkDirAndCopy (srcMode, src, dest, opts) { } function copyDir (src, dest, opts) { - fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts)) + const dir = fs.opendirSync(src) + + try { + let dirent + + while ((dirent = dir.readSync()) !== null) { + copyDirItem(dirent.name, src, dest, opts) + } + } finally { + dir.closeSync() + } } function copyDirItem (item, src, dest, opts) { diff --git a/lib/copy/copy.js b/lib/copy/copy.js index 6304b021..60161a23 100644 --- a/lib/copy/copy.js +++ b/lib/copy/copy.js @@ -113,23 +113,21 @@ async function onDir (srcStat, destStat, src, dest, opts) { await fs.mkdir(dest) } - const items = await fs.readdir(src) - // loop through the files in the current directory to copy everything - await Promise.all(items.map(async item => { - const srcItem = path.join(src, item) - const destItem = path.join(dest, item) + for await (const item of await fs.opendir(src)) { + const srcItem = path.join(src, item.name) + const destItem = path.join(dest, item.name) // skip the item if it is matches by the filter function const include = await runFilter(srcItem, destItem, opts) - if (!include) return + if (!include) continue const { destStat } = await stat.checkPaths(srcItem, destItem, 'copy', opts) // If the item is a copyable file, `getStatsAndPerformCopy` will copy it // If the item is a directory, `getStatsAndPerformCopy` will call `onDir` recursively - return getStatsAndPerformCopy(destStat, srcItem, destItem, opts) - })) + await getStatsAndPerformCopy(destStat, srcItem, destItem, opts) + } if (!destStat) { await fs.chmod(dest, srcStat.mode)