节点.js创建文件夹或使用现有文件夹

2022-08-30 01:03:03

我已经阅读了Node.js的文档,除非我错过了什么,否则它不会告诉某些操作中的参数包含什么,特别是fs.mkdir()。正如您在文档中看到的那样,它不是很多。

目前,我有这个代码,它试图创建一个文件夹或使用现有的一个文件夹:

fs.mkdir(path,function(e){
    if(!e || (e && e.code === 'EEXIST')){
        //do something with contents
    } else {
        //debug
        console.log(e);
    }
});

但我想知道这是正确的方法吗?检查代码是否是知道文件夹已存在的正确方法?我知道我可以在创建目录之前做,但这已经是文件系统的两次命中。EEXISTfs.stat()

其次,是否有完整或至少更详细的Node文档.js其中包含有关错误对象包含哪些,哪些参数表示等的详细信息。


答案 1

编辑:因为这个答案非常受欢迎,所以我更新了它以反映最新的实践。

节点 >=10

Node的新选项现在本身允许这样做。此选项模仿 UNIX 的 .它将以递归方式确保路径的每个部分都存在,并且如果其中任何一个存在,则不会引发错误。{ recursive: true }fsmkdir -p

(注意:它可能仍然会引发诸如 or 之类的错误,因此,如果您的实现容易受到它的影响,最好还是将其包装在 a 中。EPERMEACCESStry {} catch (e) {}

同步版本。

fs.mkdirSync(dirpath, { recursive: true })

异步版本

await fs.promises.mkdir(dirpath, { recursive: true })

较旧的节点版本

使用 a ,您可以非常优雅地实现这一点,而不会遇到争用条件。try {} catch (err) {}

为了防止检查存在和创建目录之间的死区时间,我们只需尝试直接创建它,如果它是(目录已经存在),则忽略错误。EEXIST

但是,如果错误不是,我们应该抛出一个错误,因为我们可以处理类似 or 的东西EEXISTEPERMEACCES

function ensureDirSync (dirpath) {
  try {
    return fs.mkdirSync(dirpath)
  } catch (err) {
    if (err.code !== 'EEXIST') throw err
  }
}

对于类似递归行为,例如 ,您必须在 dirpath 的每个部分调用它,例如 , ,mkdir -p./a/b/c./a./a/b.a/b/c


答案 2

这样做的好方法是使用mkdirp模块。

$ npm install mkdirp

使用它来运行需要目录的函数。在创建路径或路径已存在后调用回调。如果 mkdirp 无法创建目录路径,则设置错误。err

var mkdirp = require('mkdirp');
mkdirp('/tmp/some/path/foo', function(err) { 

    // path exists unless there was an error

});