我一直在尝试在使用Node.js时写入文件,但没有成功。我该怎么做?
当前回答
第1点:
如果你想写一些东西到文件中。意思是:它将删除文件中已保存的任何内容并写入新内容。使用fs.promise.writeFile()
第2点:
如果您想将某个内容附加到文件中。意思是:它不会删除文件中已保存的任何内容,而是将新项附加到文件内容中。然后首先读取文件,然后将内容添加到可读值中,然后将其写入文件。所以使用fs.promises.readFile和fs.promists.writeFile()
示例1:我想在JSON文件中编写一个JSON对象。
const fs = require('fs');
const data = {table:[{id: 1, name: 'my name'}]}
const file_path = './my_data.json'
writeFile(file_path, data)
async function writeFile(filename, writedata) {
try {
await fs.promises.writeFile(filename, JSON.stringify(writedata, null, 4), 'utf8');
console.log('data is written successfully in the file')
}
catch (err) {
console.log('not able to write data in the file ')
}
}
示例2:如果要将数据附加到JSON文件中。您希望将数据{id:1,name:‘my name’}添加到同一文件夹根目录下的文件mydata.json中。只需调用appenddata(filepath,data)函数。
如果文件存在,它将在JSON文件中附加数据。或者它将创建文件并将数据添加到其中。
const fs = require('fs');
const data = {id: 2, name: 'your name'}
const file_path = './my_data.json'
append_data(file_path, data)
async function append_data(filename, data) {
if (fs.existsSync(filename)) {
var read_data = await readFile(filename)
if (read_data == false) {
console.log('not able to read file')
} else {
read_data.table.push(data) //data must have the table array in it like example 1
var dataWrittenStatus = await writeFile(filename, read_data)
if (dataWrittenStatus == true) {
console.log('data added successfully')
} else {
console.log('data adding failed')
}
}
}
}
async function readFile(filePath) {
try {
const data = await fs.promises.readFile(filePath, 'utf8')
return JSON.parse(data)
}
catch (err) {
return false;
}
}
async function writeFile(filename, writedata) {
try {
await fs.promises.writeFile(filename, JSON.stringify(writedata, null, 4), 'utf8');
return true
}
catch (err) {
return false
}
}
其他回答
提供的答案已注明日期,更新的方法是:
const fsPromises = require('fs').promises
await fsPromises.writeFile('/path/to/file.txt', 'data to write')
有关详细信息,请参阅此处的文档
fs.createWriteStream(路径[,选项])选项还可以包括开始选项,以允许在文件开头之后的某个位置写入数据。修改文件而不是替换文件可能需要r+标志模式而不是默认模式w。编码可以是Buffer接受的任何一种。如果autoClose在“error”或“finish”时设置为true(默认行为),文件描述符将自动关闭。如果autoClose为false,则即使出现错误,也不会关闭文件描述符。应用程序负责关闭它并确保没有文件描述符泄漏。与ReadStream一样,如果指定了fd,WriteStream将忽略路径参数并使用指定的文件描述符。这意味着不会发出“打开”事件。fd应该是阻塞的;应将非阻塞fds传递给net.Socket。如果options是字符串,则它指定编码。
看完这篇长文。你应该了解它的工作原理。因此,这里有一个createWriteStream()的示例。
/* The fs.createWriteStream() returns an (WritableStream {aka} internal.Writeable) and we want the encoding as 'utf'-8 */
/* The WriteableStream has the method write() */
fs.createWriteStream('out.txt', 'utf-8')
.write('hello world');
同步写入
fs.writeFileSync(文件,数据[,选项])
fs = require('fs');
fs.writeFileSync("foo.txt", "bar");
异步写入
fs.writeFile(文件,数据[,选项],回调)
fs = require('fs');
fs.writeFile('foo.txt', 'bar', (err) => { if (err) throw err; });
哪里
file <string> | <Buffer> | <URL> | <integer> filename or file descriptor
data <string> | <Buffer> | <Uint8Array>
options <Object> | <string>
callback <Function>
值得阅读官方文件系统(fs)文档。
更新:async/await
fs = require('fs');
util = require('util');
writeFile = util.promisify(fs.writeFile);
fn = async () => { await writeFile('foo.txt', 'bar'); }
fn()
var path = 'public/uploads/file.txt',
buffer = new Buffer("some content\n");
fs.open(path, 'w', function(err, fd) {
if (err) {
throw 'error opening file: ' + err;
}
fs.write(fd, buffer, 0, buffer.length, null, function(err) {
if (err) throw 'error writing file: ' + err;
fs.close(fd, function() {
console.log('file written');
})
});
});
目前有三种方法可以写入文件:
fs.write(fd,缓冲区,偏移量,长度,位置,回调)您需要等待回调,以确保缓冲区已写入磁盘。它没有缓冲。fs.writeFile(文件名,数据,[编码],回调)所有数据必须同时存储;不能执行顺序写入。fs.createWriteStream(路径,[options])创建WriteStream,这很方便,因为您不需要等待回调。但同样,它没有缓冲。
顾名思义,WriteStream就是一个流。根据定义,流是包含沿一个方向移动的数据的“缓冲区”(源► 目的地)。但可写流不一定是“缓冲”的。当您写n次时,流被“缓冲”,在时间n+1,流将缓冲区发送到内核(因为它已满,需要刷新)。
换句话说:“缓冲区”就是对象。它是否“被缓冲”是该对象的一个属性。
如果查看代码,WriteStream继承自可写的Stream对象。如果你注意,你会看到他们是如何刷新内容的;他们没有任何缓冲系统。
如果你写一个字符串,它会被转换成一个缓冲区,然后被发送到原生层并写入磁盘。在编写字符串时,它们不会填充任何缓冲区。因此,如果您这样做:
write("a")
write("b")
write("c")
你在做:
fs.write(new Buffer("a"))
fs.write(new Buffer("b"))
fs.write(new Buffer("c"))
这是对I/O层的三次调用。虽然您使用的是“缓冲区”,但数据没有缓冲。缓冲流将执行:fs.write(new Buffer(“abc”)),一次对I/O层的调用。
截至目前,Node.js v0.12(2015年6月2日发布的稳定版本)现在支持两个功能:软木塞()和解开()。似乎这些函数最终将允许您缓冲/刷新写调用。
例如,在Java中,有一些类提供缓冲流(BufferedOutputStream、BufferedWriter…)。如果您写入三个字节,这些字节将存储在缓冲区(内存)中,而不是仅为三个字节执行I/O调用。当缓冲区已满时,内容将被刷新并保存到磁盘。这提高了性能。
我没有发现任何东西,只是记得应该如何进行磁盘访问。
推荐文章
- 给一个数字加上st, nd, rd和th(序数)后缀
- 如何以编程方式触发引导模式?
- setTimeout带引号和不带括号的区别
- 在JS的Chrome CPU配置文件中,'self'和'total'之间的差异
- 用javascript检查输入字符串中是否包含数字
- 如何使用JavaScript分割逗号分隔字符串?
- 在Javascript中~~(“双波浪号”)做什么?
- 谷歌chrome扩展::console.log()从后台页面?
- 未捕获的SyntaxError:
- [].slice的解释。调用javascript?
- jQuery日期/时间选择器
- 我如何预填充一个jQuery Datepicker文本框与今天的日期?
- npm犯错!代码UNABLE_TO_GET_ISSUER_CERT_LOCALLY
- 数组的indexOf函数和findIndex函数的区别
- jQuery添加必要的输入字段