如果它不存在,我正在尝试创建一个完整的路径.
代码如下所示:
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest);
Run Code Online (Sandbox Code Playgroud)
只要只有一个子目录(像'dir1'这样的newDest),这个代码就可以运行,但是当有一个类似于''dir1/dir2'的目录路径时,它会失败并显示 错误:ENOENT,没有这样的文件或目录
我希望能够根据需要使用尽可能少的代码行创建完整路径.
我读到fs上有一个递归选项,并尝试这样做
var fs = require('fs');
if (!fs.existsSync(newDest)) fs.mkdirSync(newDest,'0777', true);
Run Code Online (Sandbox Code Playgroud)
我觉得递归创建一个不存在的目录应该很简单.我是否遗漏了某些内容或是否需要解析路径并检查每个目录并创建它(如果它尚不存在)?
我是Node的新手.也许我正在使用旧版本的FS?
Mou*_*eer 299
编辑
NodeJS版本10为两者添加了本机支持,10.12.0并mkdir使用mkdirSync选项递归创建目录,如下所示:
fs.mkdirSync(targetDir, { recursive: true });
Run Code Online (Sandbox Code Playgroud)
如果你愿意recursive: true,你可以写
fs.promises.mkdir(targetDir, { recursive: true });
Run Code Online (Sandbox Code Playgroud)
如果目录不存在,则递归创建目录!(零依赖)
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);
}
Run Code Online (Sandbox Code Playgroud)
// 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');
Run Code Online (Sandbox Code Playgroud)
fs Promises APIMac和EISDIR和EPERM用于Windows.感谢@PediT.,@ JohnQ,@ deed02392,@ robyoder和@Almenon的所有报道评论.EACCES.{isRelativeToScript: true}而path.sep不仅仅是path.resolve()连接,以避免跨平台问题./和处理错误,fs.mkdirSync如果抛出以处理竞争条件:另一个进程可能在调用try/catch和之间添加文件fs.existsSync()并导致异常.
fs.mkdirSync().但这是一种反模式,使代码容易受到竞争条件的影响.感谢@GershomMaes关于目录存在检查的评论.csh*_*ton 76
更强大的答案是使用mkdirp.
var mkdirp = require('mkdirp');
mkdirp('/path/to/dir', function (err) {
if (err) console.error(err)
else console.log('dir created')
});
Run Code Online (Sandbox Code Playgroud)
然后继续将文件写入完整路径:
fs.writeFile ('/path/to/dir/file.dat'....
Run Code Online (Sandbox Code Playgroud)
Dee*_*ers 47
fs-extra添加了本机fs模块中未包含的文件系统方法.这是对fs的替代.
安装 fs-extra
$ npm install --save fs-extra
const fs = require("fs-extra");
// Make sure the output directory is there.
fs.ensureDirSync(newDest);
Run Code Online (Sandbox Code Playgroud)
有同步和异步选项.
https://github.com/jprichardson/node-fs-extra/blob/master/docs/ensureDir.md
bry*_*mac 45
一种选择是使用shelljs模块
npm install shelljs
var shell = require('shelljs');
shell.mkdir('-p', fullPath);
Run Code Online (Sandbox Code Playgroud)
从该页面:
可用选项:
p:完整路径(如有必要,将创建中间目录)
正如其他人所指出的那样,还有其他更集中的模块.但是,在mkdirp之外,它有大量其他有用的shell操作(比如grep等......)并且它适用于windows和*nix
jos*_*bui 30
使用reduce我们可以验证每个路径是否存在并在必要时创建它,这样我认为它更容易理解.编辑,感谢@Arvin,我们应该使用path.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;
}, '');
Run Code Online (Sandbox Code Playgroud)
我知道这是一个老问题,但是nodejs v10.12.0现在本机支持,并且recursive设置为true。fs.mkdir
// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
if (err) throw err;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
103899 次 |
| 最近记录: |