我一直在摆弄Node.js,发现了一个小问题。我有一个脚本驻留在一个名为data的目录中。我希望脚本将一些数据写入数据子目录中的子目录中的文件。然而,我得到以下错误:
{ [Error: ENOENT, open 'D:\data\tmp\test.txt'] errno: 34, code: 'ENOENT', path: 'D:\\data\\tmp\\test.txt' }
代码如下:
var fs = require('fs');
fs.writeFile("tmp/test.txt", "Hey there!", function(err) {
if(err) {
console.log(err);
} else {
console.log("The file was saved!");
}
});
有人能帮我找出如何使Node.js创建目录结构,如果它不退出写入文件?
使用node-fs-extra,你可以很容易地做到这一点。
安装它
npm install --save fs-extra
然后使用outputFile方法。它的文档说:
几乎与writeFile相同(即它覆盖),除了如果
父目录不存在,它是创建的。
你可以用四种方法来使用它。
异步- await
const fse = require('fs-extra');
await fse.outputFile('tmp/test.txt', 'Hey there!');
使用承诺
如果你使用承诺,代码如下:
const fse = require('fs-extra');
fse.outputFile('tmp/test.txt', 'Hey there!')
.then(() => {
console.log('The file has been saved!');
})
.catch(err => {
console.error(err)
});
回调风格
const fse = require('fs-extra');
fse.outputFile('tmp/test.txt', 'Hey there!', err => {
if(err) {
console.log(err);
} else {
console.log('The file has been saved!');
}
})
同步版本
如果你想要一个同步版本,只需使用下面的代码:
const fse = require('fs-extra')
fse.outputFileSync('tmp/test.txt', 'Hey there!')
要获得完整的参考,请查看outputFile文档和所有node-fs-extra支持的方法。
使用node-fs-extra,你可以很容易地做到这一点。
安装它
npm install --save fs-extra
然后使用outputFile方法。它的文档说:
几乎与writeFile相同(即它覆盖),除了如果
父目录不存在,它是创建的。
你可以用四种方法来使用它。
异步- await
const fse = require('fs-extra');
await fse.outputFile('tmp/test.txt', 'Hey there!');
使用承诺
如果你使用承诺,代码如下:
const fse = require('fs-extra');
fse.outputFile('tmp/test.txt', 'Hey there!')
.then(() => {
console.log('The file has been saved!');
})
.catch(err => {
console.error(err)
});
回调风格
const fse = require('fs-extra');
fse.outputFile('tmp/test.txt', 'Hey there!', err => {
if(err) {
console.log(err);
} else {
console.log('The file has been saved!');
}
})
同步版本
如果你想要一个同步版本,只需使用下面的代码:
const fse = require('fs-extra')
fse.outputFileSync('tmp/test.txt', 'Hey there!')
要获得完整的参考,请查看outputFile文档和所有node-fs-extra支持的方法。
节点> 10.12.0
fs。Mkdir现在接受一个{recursive: true}选项,如下所示:
// Creates /tmp/a/apple, regardless of whether `/tmp` and /tmp/a exist.
fs.mkdir('/tmp/a/apple', { recursive: true }, (err) => {
if (err) throw err;
});
或者带着承诺:
fs.promises.mkdir('/tmp/a/apple', { recursive: true }).catch(console.error);
指出,
在很多情况下你会使用fs。mkdirSync而不是fs.mkdir
在后面加上斜杠是无害的/没有效果的。
mkdirSync/mkdir没有任何伤害,如果目录已经存在,不需要检查是否存在。
节点<= 10.11.0
您可以使用mkdirp或fs-extra这样的包来解决这个问题。如果你不想安装一个软件包,请参阅Tiago Peres França下面的回答。