Node.js 创建文件夹或使用现有的

新手上路,请多包涵

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

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

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

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

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

原文由 Joseph 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 985
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

 });

原文由 Teemu Ikonen 发布,翻译遵循 CC BY-SA 3.0 许可协议

编辑: 因为这个答案很受欢迎,所以我更新了它以反映最新的做法。

节点 >=10

新的 { recursive: true } Node 的选项 fs 现在本机允许这个。此选项模仿 UNIX 的行为 mkdir -p 。它将递归地确保路径的每个部分都存在,并且如果其中任何一个存在则不会抛出错误。

(注意:它可能仍然会抛出诸如 EPERMEACCESS 之类的错误,所以最好还是将它包装在 try {} catch (e) {} 中。如果你的实现是—

同步版本。

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

异步版本

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

较旧的节点版本

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

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

但是,如果错误不是 EEXIST ,我们应该抛出错误,因为我们可能正在处理类似 EPERMEACCES

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

For mkdir -p recursive behaviour, eg ./a/b/c , you’d have to call it on every part of the dirpath, eg ./a , ./a/b , .a/b/c

原文由 Christophe Marois 发布,翻译遵循 CC BY-SA 4.0 许可协议

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