我正在尝试创建一个完整的路径,如果它不存在。
代码如下所示:
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest);
只要只有一个子目录(像‘dir1’这样的目录),这段代码就能很好地工作,但是当有像('dir1/dir2')这样的目录路径时,它就会失败,并返回错误: ENOENT,没有这样的文件或目录
我希望能够用尽可能少的代码行来创建完整的路径。
我读到fs上有一个递归选项,并尝试如下所示
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);
我觉得递归创建一个不存在的目录应该就这么简单。我是否遗漏了什么,或者我是否需要解析路径并检查每个目录,如果它不存在,则创建它?
我是Node的新手。也许我使用的是旧版本的FS?
发布于 2016-11-19 06:21:04
编辑
NodeJS version 10.12.0
添加了对mkdir
和mkdirSync
的本机支持,以使用recursive: true
选项递归创建目录,如下所示:
fs.mkdirSync(targetDir, { recursive: true });
如果你更喜欢fs Promises API
,你可以写
fs.promises.mkdir(targetDir, { recursive: true });
原始答案
如果目录不存在,则递归地创建它们!(零依赖)
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);
}
用法
// 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');
演示
解释
EPERM
的EISDIR
以及用于Windows的EACCES
。感谢@PediT.,@JohnQ,@deed02392,@robyoder和@Almenon.{isRelativeToScript: true}
.path.sep
和path.resolve()
,而不仅仅是/
连接,以避免跨平台issues.fs.mkdirSync
,并在抛出竞争条件时使用try/catch
处理错误:另一个进程可能会在对fs.existsSync()
和fs.mkdirSync()
的调用之间添加文件并导致异常。if (!fs.existsSync(curDir) fs.mkdirSync(curDir);
。但这是一种反模式,使代码容易受到竞争条件的影响。感谢@GershomMaes对目录存在check.的评论
发布于 2016-02-03 23:12:48
更可靠的答案是使用mkdirp。
var mkdirp = require('mkdirp');
mkdirp('/path/to/dir', function (err) {
if (err) console.error(err)
else console.log('dir created')
});
然后,使用以下命令将该文件写入完整路径:
fs.writeFile ('/path/to/dir/file.dat'....
发布于 2017-03-02 05:27:43
fs-extra添加了本地文件系统模块中没有的文件系统方法。它是fs的一小部分替代品。
安装fs-extra
$ npm install --save fs-extra
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
https://stackoverflow.com/questions/31645738
复制相似问题