首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用节点的fs.mkdirSync创建全路径?

如何使用节点的fs.mkdirSync创建全路径?
EN

Stack Overflow用户
提问于 2015-07-27 13:49:03
回答 21查看 183.5K关注 0票数 231

我正在尝试创建一个完整的路径,如果它不存在。

代码如下所示:

代码语言:javascript
运行
复制
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest); 

只要只有一个子目录(像‘dir1’这样的目录),这段代码就能很好地工作,但是当有像('dir1/dir2')这样的目录路径时,它就会失败,并返回错误: ENOENT,没有这样的文件或目录

我希望能够用尽可能少的代码行来创建完整的路径。

我读到fs上有一个递归选项,并尝试如下所示

代码语言:javascript
运行
复制
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);

我觉得递归创建一个不存在的目录应该就这么简单。我是否遗漏了什么,或者我是否需要解析路径并检查每个目录,如果它不存在,则创建它?

我是Node的新手。也许我使用的是旧版本的FS?

EN

回答 21

Stack Overflow用户

发布于 2016-11-19 06:21:04

编辑

NodeJS version 10.12.0添加了对mkdirmkdirSync的本机支持,以使用recursive: true选项递归创建目录,如下所示:

代码语言:javascript
运行
复制
fs.mkdirSync(targetDir, { recursive: true });

如果你更喜欢fs Promises API,你可以写

代码语言:javascript
运行
复制
fs.promises.mkdir(targetDir, { recursive: true });

原始答案

如果目录不存在,则递归地创建它们!(零依赖)

代码语言:javascript
运行
复制
const fs = require('fs');
const path = require('path');

function mkDirByPathSync(targetDir, { isRelativeToScript = false } = {}) {
  const sep = path.sep;
  const initDir = path.isAbsolute(targetDir) ? sep : '';
  const baseDir = isRelativeToScript ? __dirname : '.';

  return targetDir.split(sep).reduce((parentDir, childDir) => {
    const curDir = path.resolve(baseDir, parentDir, childDir);
    try {
      fs.mkdirSync(curDir);
    } catch (err) {
      if (err.code === 'EEXIST') { // curDir already exists!
        return curDir;
      }

      // To avoid `EISDIR` error on Mac and `EACCES`-->`ENOENT` and `EPERM` on Windows.
      if (err.code === 'ENOENT') { // Throw the original parentDir error on curDir `ENOENT` failure.
        throw new Error(`EACCES: permission denied, mkdir '${parentDir}'`);
      }

      const caughtErr = ['EACCES', 'EPERM', 'EISDIR'].indexOf(err.code) > -1;
      if (!caughtErr || caughtErr && curDir === path.resolve(targetDir)) {
        throw err; // Throw if it's just the last created dir.
      }
    }

    return curDir;
  }, initDir);
}

用法

代码语言:javascript
运行
复制
// Default, make directories relative to current working directory.
mkDirByPathSync('path/to/dir');

// Make directories relative to the current script.
mkDirByPathSync('path/to/dir', {isRelativeToScript: true});

// Make directories with an absolute path.
mkDirByPathSync('/path/to/dir');

演示

解释

  • UPDATE此解决方案可处理特定于平台的错误,如用于Mac和EPERMEISDIR以及用于Windows的EACCES。感谢@PediT.,@JohnQ,@deed02392,@robyoder和@Almenon.
  • This的所有报告评论,解决方案可以处理相对绝对路径。多亏了@john comment.
  • 在相对路径的情况下,目标目录将在当前工作目录中创建(解析)。要解决与当前脚本目录相关的问题,请传递{isRelativeToScript: true}.
  • Using path.seppath.resolve(),而不仅仅是/连接,以避免跨平台issues.
  • Using fs.mkdirSync,并在抛出竞争条件时使用try/catch处理错误:另一个进程可能会在对fs.existsSync()fs.mkdirSync()的调用之间添加文件并导致异常。
    • 另一种方法是检查文件是否存在,然后创建它,即if (!fs.existsSync(curDir) fs.mkdirSync(curDir);。但这是一种反模式,使代码容易受到竞争条件的影响。感谢@GershomMaes对目录存在check.

的评论

  • 需要Node v6及更高版本才能支持解构。(如果您在使用旧节点版本实现此解决方案时遇到问题,请给我留言)
票数 623
EN

Stack Overflow用户

发布于 2016-02-03 23:12:48

更可靠的答案是使用mkdirp

代码语言:javascript
运行
复制
var mkdirp = require('mkdirp');

mkdirp('/path/to/dir', function (err) {
    if (err) console.error(err)
    else console.log('dir created')
});

然后,使用以下命令将该文件写入完整路径:

代码语言:javascript
运行
复制
fs.writeFile ('/path/to/dir/file.dat'....
票数 84
EN

Stack Overflow用户

发布于 2017-03-02 05:27:43

fs-extra添加了本地文件系统模块中没有的文件系统方法。它是fs的一小部分替代品。

安装fs-extra

$ npm install --save fs-extra

代码语言:javascript
运行
复制
const fs = require("fs-extra");
// Make sure the output directory is there.
fs.ensureDirSync(newDest);

有同步和异步选项。

https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md

票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31645738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档