我正在编写一个公开一个函数的对象,该函数将一个字符串附加到文件的末尾,以确保:
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 );
答案 0 :(得分:2)
好的,所以我做了一些测试,并提出了以下代码,它假设文件不存在(如果有的话,它将因为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)的块,所以第一个块是256kb,接下来的128kb是1kb,在一次试运行中,第一个块最后插入而不是第一块,所有其他块都按顺序插入。在整个测试过程中也保留了块完整性。基于硬件,软件和负载,您的系统的结果可能会有所不同。对于日志记录而言,不按顺序排列并不可怕,因为每个块都可以(并且应该)添加时间戳。
显而易见的是: