617 votes

La façon la plus rapide de copier le fichier dans node.js

Projet que je suis en train de travailler à (node.js) implique beaucoup d'opérations de système de fichiers (copie/lecture/écriture, etc). J'aimerais savoir, quelles sont les méthodes les plus rapides, et je serais heureux pour quelques conseils.

Merci à l'avance!

926voto

MiguelSanchezGonzalez Points 1419

C'est un bon moyen pour copier un fichier sur une seule ligne de code à l'aide de flux:

var fs = require('fs');

fs.createReadStream('test.log').pipe(fs.createWriteStream('newLog.log'));

297voto

Mike Schilling Points 1088

Le même mécanisme, mais cela ajoute de la gestion des erreurs:

function copyFile(source, target, cb) {
  var cbCalled = false;

  var rd = fs.createReadStream(source);
  rd.on("error", function(err) {
    done(err);
  });
  var wr = fs.createWriteStream(target);
  wr.on("error", function(err) {
    done(err);
  });
  wr.on("close", function(ex) {
    done();
  });
  rd.pipe(wr);

  function done(err) {
    if (!cbCalled) {
      cb(err);
      cbCalled = true;
    }
  }
}

149voto

Timmerz Points 1235

Je n'ai pas été en mesure d'obtenir l' createReadStream/createWriteStream méthode de travail pour une raison quelconque, mais à l'aide de fs-extra mnp module qu'il a fonctionné tout de suite. Je ne suis pas sûr de la différence de performances.

fs-extra

npm install --save fs-extra

var fs = require('fs-extra');

fs.copySync(path.resolve(__dirname,'./init/xxx.json'), 'xxx.json');

45voto

Tester Points 173

Eh bien, en général il est bon d'éviter de fichier asynchrone opérations. Voici la courte (pas de gestion d'erreur) sync exemple:

var fs = require('fs');
fs.writeFileSync(targetFile, fs.readFileSync(sourceFile));

18voto

Jens Hauke Points 51

Mike Schilling de la solution avec l'erreur de manipulation avec un raccourci pour le gestionnaire d'événement d'erreur.

function copyFile(source, target, cb) {
  var cbCalled = false;

  var rd = fs.createReadStream(source);
  rd.on("error", done);

  var wr = fs.createWriteStream(target);
  wr.on("error", done);
  wr.on("close", function(ex) {
    done();
  });
  rd.pipe(wr);

  function done(err) {
    if (!cbCalled) {
      cb(err);
      cbCalled = true;
    }
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X