Почему этот узел stream.write не перезаписывает содержимое файла? Как производительность меняется с Node fwrite? - PullRequest
0 голосов
/ 04 июля 2019

Мое намерение - написать файл для определенного интервала. Создал узел writeStream вне интервала и попытался использовать тот же поток внутри интервала для записи содержимого в файл. Я ожидаю, что контент будет перезаписан, но он начал добавляться. Вот один подход

Подход I:

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var stream = fs.createWriteStream('stats.log.info',{flags:'w'});
var writeInterval = setInterval(function(){
  var data =ans[i%ans.length] ;
  if(data.length == 0){
    console.log("Failure in ");
  }
  stream.on('error', function(err){
    console.log("error in creating a stream "+err);
    clearInterval(writeInterval);
    stream.destroy();
    return;
  });
  stream.write(data);

  i++;
},2000);

Затем я переместил созданный поток в интервал, который заканчивается перезаписью содержимого файла. Подход I: созданный поток, помещенный в интервал

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var writeInterval = setInterval(function(){
  var stream = fs.createWriteStream('stats.log.info',{flags:'w'});

  var data =ans[i%ans.length] ;
      if(data.length == 0){
        console.log("Failure in ");
      }
      stream.on('error', function(err){
        console.log("error in creating a stream "+err);
        clearInterval(writeInterval);
        stream.destroy();
        return;
      });
      stream.write(data);

      i++;
    },2000);

Мне интересно, как я могу использовать один созданный поток для перезаписи содержимого файла. Я попробовал другой подход, используя стандартную запись файла Node. Он отлично работает, чтобы перезаписать контент. Но он включает fopen и fclose внутри интервала, что каждый раз кажется довольно дорогостоящими операциями. Вот образец

Подход II:

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var writeInterval = setInterval(function(){
  var data =ans[i%ans.length] ;
  if(data.length == 0){
    console.log("Failure in ");
  }
    var fopen_write = fs.open("curr.log", 'w', function(err, fd){
        var buf = new Buffer(data, 'utf8');
        fs.write(fd, buf, 0, buf.length, null, function(err) {
            if (err) throw 'error writing file: ' + err;
            fs.close(fd, function() {
                console.log('wrote the file successfully');
            });
        });
    })
  i++;
},2000);

Предложения по оценке подходов с лучшими характеристиками действительно полезны.

Я ценю ваше время и усилия!

1 Ответ

0 голосов
/ 04 июля 2019

Try

var fs = require('fs');
var ans = ["first","second","third","fourth","fifth"];
var i =0;
var stream = fs.createWriteStream('stats.log.info',{flags:'w'});
var writeInterval = setInterval(function(){
  var data =ans[i%ans.length] ;
  if(data.length == 0){
    console.log("Failure in ");
  }
  stream.on('error', function(err){
    console.log("error in creating a stream "+err);
    clearInterval(writeInterval);
    stream.destroy();
    return;
  });
  stream.pos = 0;// set pos to 0;
  stream.write(data);
  i++;
},2000);

Однако это плохая идея!pos не является стандартным свойством writeStream, и продолжать вызывать write метод потока записи в файл означает добавление данных в файл, лучше не менять это поведение.

...