3

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

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

我正在使用 fs.open fs.write 和缓冲区,因为 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 );
4

1 回答 1

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,在一次试运行中,第一个块最后插入而不是第一个块,所有其他块按顺序插入. 在整个测试过程中,块的完整性也得到了保留。根据硬件、软件和负载,您的系统上的结果可能会有所不同。出于日志记录的目的,不按顺序排列并不可怕,因为每个块都可以(并且应该)在前面加上时间戳。

清楚的是:

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