Использование fs.open и fs.write для записи исключительно в файл

Я пишу объект, который предоставляет функцию, которая добавляет строку в конец файла, гарантируя, что:

1- файл записывается немедленно. 2- программа имеет эксклюзивную блокировку файла. 3- блокировка сохраняется между записями

Я использую fs.open fs.write и буфер, потому что потоки кажутся слишком сложными. Я предполагаю, что мне пришлось бы сбрасывать после записи, если бы я использовал поток.

Можно ли вызывать 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 );

person kaan_a    schedule 10.08.2013    source источник
comment
каковы ваши цели? вместо этого вы можете попробовать fs.writeFile или fs.WriteStream. В документации Node.JS параметры внутри [] являются необязательными, поэтому они не являются обязательными.   -  person micnic    schedule 10.08.2013
comment
Я пишу в файл журнала и хотел бы получить к нему эксклюзивный доступ.   -  person kaan_a    schedule 10.08.2013


Ответы (1)


Хорошо, поэтому я провел некоторое тестирование и придумал следующий код, который предполагает, что файл не существует (если он существует, он выдаст исключение из-за флага 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!" будет написано перед "Goodbye World!" если вместо fs.writeSync() используется fs.write(). Я тщательно проверял это, и только один раз был неправильный порядок. Я вставил последовательность фрагментов размером s/(2^n), поэтому первый фрагмент был 256 КБ, а следующие 128 КБ уменьшились до 1 КБ, и в одном пробном запуске первый фрагмент был вставлен последним, а не первым, и все остальные фрагменты были в порядке. . Целостность чанка также сохранялась на протяжении всех испытаний. Результаты могут отличаться в вашей системе в зависимости от оборудования, программного обеспечения и нагрузки. Для целей ведения журнала непорядок не является ужасным, поскольку каждый фрагмент может (и должен) предваряться отметкой времени.

Что ясно, так это:

  1. Смещение и длина являются обязательными и вызовут исключения, если оставить их пустыми.
  2. Смещение и длина указаны в байтах.
  3. Необходимо использовать Buffer.length, как в первом примере вопроса. Несмотря на то, что большую часть времени string.length == buffer.length, если кодировка utf8, лучше не использовать второй пример.
  4. Позиция может быть неопределенной (не указывается в вызове функции) и будет вести себя так, как если бы она была нулевой (в функции нет строгого равенства).
  5. Обратный вызов может быть неопределенным (как указано в документации)
person kaan_a    schedule 16.08.2013