书上说这段代码在目录被glob
匹配的情况下(如node_modules/fs.stat
)应该报错,但是我在本地执行没有。
下面代码实现了一个copy
的功能,将source directory
下的所有文件复制到destination directory
。
对这段代码的几点说明:
- 此处的
glob
版本为7.2.3
,最新版本的glob
是基于promise的,不再支持回调。 fs-extra
提供了更多的功能,相比于fs
。fs.ensureDir
确保该目录存在,如果不存在,就创建一个。fs.copy
复制一个文件或目录。
import glob from 'glob' import fs from 'fs-extra' import path from 'path' const [srcRoot, dstRoot] = process.argv.slice(2) glob(`${srcRoot}/**/*.*`, { ignore: '*.bck' }, (err, files) => { if (err) { console.log(err) } else { for (const srcName of files) { const dstName = srcName.replace(srcRoot, dstRoot) const dstDir = path.dirname(dstName) fs.ensureDir(dstDir, (err) => { if (err) { console.error(err) } else { fs.copy(srcName, dstName, (err) => { if (err) { console.error(err) } }) } }) } } })
执行
rm -rf /tmp/out mkdir /tmp/out node copy-file-unfiltered.js ../node_modules /tmp/out 2>&1 | head -n 6
书上说应该出现如下错误
[Error: ENOENT: no such file or directory, chmod \ '/tmp/out/@nodelib/fs.stat/README.md'] { errno: -2, code: 'ENOENT', syscall: 'chmod', path: '/tmp/out/@nodelib/fs.stat/README.md' }
书上对此错误做出了如下解释
The problem is that node_modules/fs.stat and node_modules/fs.walk match our globbing expression, but are directories rather than files.
但是我在本地复现的时候并没有出现这个错误,fs.ensureDir
确保了目录存在,怎么会报no such file or directory
错误呢?
为什么要这么麻烦?尽信书不如无书,现在复制目录直接
await fs.cp(from, to, { recursive: true })
就行了,了不起加一句mkdir(to, { recursive: true })
。node.js 马上就要 22 了,现在学就不用从上古版本学起了。不要在这种细节上浪费时间。