我正在编写一个公开一个函数的对象,该函数将一个字符串附加到文件的末尾,以确保:
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 );
1 回答
好的,所以我做了一些测试并提出了以下代码,它假设该文件不存在(如果有的话,它将因为x标志而抛出异常):
这段代码不能总是保证“Hello World!”将在“再见世界”之前写出来!如果使用fs.write()而不是fs.writeSync() . 我已经对此进行了广泛的测试,并且只有一次订单错误 . 我插入了一系列大小为s /(2 ^ n)的块,所以第一个块是256kb,接下来的128kb是1kb,在一次试运行中,第一个块是最后一个而不是第一个插入的,所有其他块都按顺序排列 . 在整个测试过程中也保留了块完整性 . 基于硬件,软件和负载,您的系统的结果可能会有所不同 . 对于日志记录目的而言,不按顺序并不可怕,因为每个块都可以(并且应该)添加时间戳 .
很清楚的是:
偏移量和长度是必需的,如果留空则会导致异常 .
偏移量和长度以字节为单位 .
必须使用
Buffer.length,就像在问题的第一个例子中一样 . 尽管大多数时候string.length == buffer.length如果编码是utf8,最好不要使用第二个例子 .
位置可以是未定义的(函数调用中未提供),其行为就像null(函数中没有强相等)
回调可以是未定义的(如文档中所指定)