为什么没有报错呢?

书上说这段代码在目录被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错误呢?

阅读 971
2 个回答

为什么要这么麻烦?尽信书不如无书,现在复制目录直接 await fs.cp(from, to, { recursive: true }) 就行了,了不起加一句 mkdir(to, { recursive: true })

node.js 马上就要 22 了,现在学就不用从上古版本学起了。不要在这种细节上浪费时间。

glob模式差异?
还有建议去掉head命令,
再看看fs-extra版本

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题