gpt4 book ai didi

javascript - 使用 fs.open 和 fs.write 专门写入一个文件

转载 作者:搜寻专家 更新时间:2023-10-31 23:55:20 24 4
gpt4 key购买 nike

我正在编写一个对象,该对象公开一个将字符串附加到文件末尾的函数,以确保:

1- 立即写入文件。2- 程序对文件有独占锁。3- 锁在写入之间是持久的

我用的是fs.open fs.write和buffer,因为Streams好像太复杂了。我假设如果我使用流,我将不得不在写入后刷新。

是否可以在没有大多数选项的情况下调用 fs.write() 和 fs.writeSync()。

/* What I would like to do is this: */

buffer = new Buffer( string, encoding );
fs.write( fd, buffer, callback );
fs.writeSync( fd, buffer );

// Failing that I would like to know which of these is correct:

fs.write( fd, buffer, 0, buffer.length, null, callback );
fs.write( fd, buffer, 0, string.length, null, callback );

最佳答案

好的,所以我做了一些测试并提出了以下代码,它假定该文件不存在(如果它存在,它会因为 x 标志而抛出异常):

var fs = require("fs");
var log = {

filename: "path",
flag: "ax",
mode: 0444,
file: null,
encoding: "utf8",
finalMode: 0644,

write: function( string ) {
if( this.file == null ) {

this.file = fs.openSync(this.filename, this.flag, this.mode);

}
if( string instanceof String ) string = string.toString();
if( typeof string != "string" ) string = JSON.stringify( string );
var buffer = new Buffer( string, this.encoding );
fs.writeSync(this.file, buffer, 0, buffer.length);
return this;
},
close: function() {
fs.close(this.file);
if( this.finalMode != this.mode ) {
fs.chmod(this.filename, this.finalMode);
}
return this;
}
}

log.write("Hello World!\n").write("Goodbye World!\n").close();

此代码不能始终保证“Hello World!”会写在《再见世界!如果使用 fs.write() 而不是 fs.writeSync()。我对此进行了广泛的测试,只有一次顺序错误。我插入了一系列大小为 s/(2^n) 的 block ,所以第一个 block 是 256kb,接下来的 128kb 下降到 1kb,在一次试运行中,第一个 block 最后插入而不是第一个,所有其他 block 都按顺序插入.在整个测试过程中, block 的完整性也得到了保留。根据硬件、软件和负载,结果可能因您的系统而异。出于日志记录的目的,不按顺序并不可怕,因为每个 block 都可以(并且应该)在前面加上时间戳。

可以明确的是:

  1. 偏移量和长度是必需的,如果离开会导致异常空的。
  2. 偏移量和长度以字节为单位。
  3. 必须使用 Buffer.length,就像问题的第一个例子一样。即使大多数时候 string.length == buffer.length 如果编码是 utf8 最好不要使用第二个例子。
  4. Position 可以是未定义的(未在函数调用中提供)并且表现为 null(函数中没有强相等性)
  5. 回调可以是未定义的(如在文档)

关于javascript - 使用 fs.open 和 fs.write 专门写入一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18162568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com