在 Node.js 中编写文件

IT技术 javascript node.js file express fs
2021-01-13 04:28:37

我一直试图找到一种在使用 Node.js 时写入文件的方法,但没有成功。我怎样才能做到这一点?

6个回答

File System API中有很多细节最常见的方式是:

const fs = require('fs');

fs.writeFile("/tmp/test", "Hey there!", function(err) {
    if(err) {
        return console.log(err);
    }
    console.log("The file was saved!");
}); 

// Or
fs.writeFileSync('/tmp/test-sync', 'Hey there!');
另请注意,您可以使用 fs.writeFileSync(...) 同步完成相同的操作。
2021-03-10 04:28:37
也许它有点旧,但是@AndersonGreen,您需要以 root 或 chmod /home 正确运行 node 以允许对当前节点进程所有者(您的用户名强硬)的 R/W 权限,以便您可以编写文件
2021-03-22 04:28:37
我已经使用 Node 测试了这个脚本,并尝试将文件路径更改为“/home/”,但出现以下错误:{ [Error: EACCES, open '/home/test.txt'] errno: 3, code: 'EACCES', path: '/home/test.txt' } 如何修改此脚本以使其在/tmp.
2021-03-28 04:28:37
@JaneAvriette 好吧,因为他想将文件保存在/home我建议对其进行 chmod 的目录中。我知道它可能会产生安全问题。但是,如果用户想在那里保存,那就是解决方案。PS:我同意你说的(:
2021-04-02 04:28:37
实际上,@DenysVitali,问题是 jane 不应该将任何文件写入/home/.... 通常该目录是 755 root:wheel(或其他)。如果节点想以 jane 的身份写入文件,那么写入/home/jane/test.txt. 更改/home为比 755 更宽容的东西是一个巨大的错误。
2021-04-03 04:28:37

目前有三种写文件的方式:

  1. fs.write(fd, buffer, offset, length, position, callback)

    您需要等待回调以确保将缓冲区写入磁盘。它没有缓冲。

  2. fs.writeFile(filename, data, [encoding], callback)

    所有数据必须同时存储;您不能执行顺序写入。

  3. fs.createWriteStream(path, [options])

    创建一个WriteStream,这很方便,因为您不需要等待回调。但同样,它没有缓冲。

A WriteStream,顾名思义,是一个流。根据定义,流是包含沿一个方向(源 ► 目标)移动的数据的“缓冲区”。但是可写流不一定是“缓冲的”。当您写入n时间时,流被“缓冲” ,并且在 time 时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 年 2 月 6 日发布的稳定版)中,现在支持两个函数: cork()uncork(). 似乎这些函数最终将允许您缓冲/刷新写入调用。

例如,在 Java 中有一些类提供缓冲流(BufferedOutputStreamBufferedWriter...)。如果写入三个字节,这些字节将存储在缓冲区(内存)中,而不是仅对三个字节进行 I/O 调用。当缓冲区已满时,内容将被刷新并保存到磁盘。这提高了性能。

我没有发现任何东西,只是记得应该如何进行磁盘访问。

任何机会,你可以提供如何使用的例子cork(),并uncork()为我们这些谁想要尝试发布前0.11节点?
2021-03-12 04:28:37
+1 - 很好的解释。对于写流,仔细阅读文档很重要。如果返回 false 或关闭,调用 writer.once('drain', function(){}) 很重要,否则我错过了进程结束时没有耗尽的行。
2021-03-14 04:28:37
截至目前,Node v0.12 是稳定的。
2021-03-24 04:28:37
是否有npm实现缓冲写入的生产质量库
2021-04-04 04:28:37
根据对 GitHub 代码的分析,fs.writeFile 似乎是您提到的功能中最受欢迎的。以下是使用 fs.writeFile 的真实示例
2021-04-06 04:28:37

你当然可以让它更高级一点。非阻塞,写入零碎,而不是一次写入整个文件:

var fs = require('fs');
var stream = fs.createWriteStream("my_file.txt");
stream.once('open', function(fd) {
  stream.write("My first row\n");
  stream.write("My second row\n");
  stream.end();
});
@JoLiss 你将不得不等待它。
2021-03-10 04:28:37
传递给 stream.once 回调的“fd”变量是什么?
2021-03-13 04:28:37
我不确定流是否被刷新。我的猜测是有可能按需刷新流。
2021-03-26 04:28:37
@ScottDavidTesler 文件描述符,因此您可以在完成后关闭流。
2021-03-27 04:28:37
我什么时候关闭流?为什么这是非阻塞的?只是好奇,我正在尝试写入日志文件。
2021-04-06 04:28:37

同步写入

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)文档

更新:异步/等待

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');
        })
    });
});
因为在这个例子中,偏移量如果设置为'0'(= 的第三个参数fs.write()),这个例子只有在所有内容都足够短以在单个写入调用中写入时才有效。
2021-03-24 04:28:37
这演示了如何使用较低级别的 fs 操作编写文件。例如,您可以保证文件何时完成写入磁盘并已释放文件描述符。
2021-04-02 04:28:37