我试图创建一个完整的路径,如果它不存在。
代码如下所示:
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest);
只要只有一个子目录(像'dir1'这样的newDest),这段代码就能很好地工作,但是当有一个目录路径('dir1/dir2')时,它就会失败
错误:ENOENT,没有这样的文件或目录
我希望能够用尽可能少的代码行创建完整的路径。
我读到fs上有一个递归选项,并尝试了这样做
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);
我觉得递归地创建一个不存在的目录应该这么简单。我是否遗漏了一些东西,或者我是否需要解析路径并检查每个目录,如果它不存在,则创建它?
我对Node很陌生。也许我使用的是旧版本的FS?
您可以使用下一个函数
const recursiveUpload =(路径:字符串)=> {
Const paths = path.split("/")
const fullPath = paths.reduce((accumulator, current) => {
fs.mkdirSync(accumulator)
return `${accumulator}/${current}`
})
fs.mkdirSync(fullPath)
return fullPath
}
它的作用是:
创建路径变量,它将每个路径单独存储为数组的一个元素。
在数组中每个元素的末尾添加"/"。
形成循环:
从索引从0到当前迭代的数组元素的连接中创建一个目录。基本上,它是递归的。
希望有帮助!
顺便说一下,在Node v10.12.0中,可以通过将递归路径创建作为附加参数来使用。
fs。mkdir(“/ tmp / /苹果”,{递归:真},(err) = > {
如果(错误)抛出错误;
});
https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options
使用reduce,我们可以验证每个路径是否存在,并在必要时创建它,而且我认为这样更容易遵循。编辑,谢谢@Arvin,我们应该使用路径。Sep来获得适当的平台特定路径段分隔符。
const path = require('path');
// Path separators could change depending on the platform
const pathToCreate = 'path/to/dir';
pathToCreate
.split(path.sep)
.reduce((prevPath, folder) => {
const currentPath = path.join(prevPath, folder, path.sep);
if (!fs.existsSync(currentPath)){
fs.mkdirSync(currentPath);
}
return currentPath;
}, '');
Exec在windows上可能很乱。还有一个更“nodie”的解决方案。基本上,您有一个递归调用来查看目录是否存在,并深入子目录(如果存在)或创建它。下面是一个函数,它将创建子函数,并在完成时调用一个函数:
fs = require('fs');
makedirs = function(path, func) {
var pth = path.replace(/['\\]+/g, '/');
var els = pth.split('/');
var all = "";
(function insertOne() {
var el = els.splice(0, 1)[0];
if (!fs.existsSync(all + el)) {
fs.mkdirSync(all + el);
}
all += el + "/";
if (els.length == 0) {
func();
} else {
insertOne();
}
})();
}
您可以使用下一个函数
const recursiveUpload =(路径:字符串)=> {
Const paths = path.split("/")
const fullPath = paths.reduce((accumulator, current) => {
fs.mkdirSync(accumulator)
return `${accumulator}/${current}`
})
fs.mkdirSync(fullPath)
return fullPath
}
它的作用是:
创建路径变量,它将每个路径单独存储为数组的一个元素。
在数组中每个元素的末尾添加"/"。
形成循环:
从索引从0到当前迭代的数组元素的连接中创建一个目录。基本上,它是递归的。
希望有帮助!
顺便说一下,在Node v10.12.0中,可以通过将递归路径创建作为附加参数来使用。
fs。mkdir(“/ tmp / /苹果”,{递归:真},(err) = > {
如果(错误)抛出错误;
});
https://nodejs.org/api/fs.html#fs_fs_mkdirsync_path_options