623 Stimmen

Der schnellste Weg, eine Datei in Node.js zu kopieren

Das Projekt, an dem ich arbeite (Node.js) impliziert viele Operationen mit dem Dateisystem (Kopieren, Lesen, Schreiben, etc.).

Welche Methoden sind die schnellsten?

934voto

Verwenden Sie den standardmäßig eingebauten Weg fs.copyFile :

const fs = require('fs');

// File destination.txt will be created or overwritten by default.
fs.copyFile('source.txt', 'destination.txt', (err) => {
  if (err) throw err;
  console.log('source.txt was copied to destination.txt');
});

Wenn Sie alte End-of-Life-Versionen von Node.js unterstützen müssen - hier ist, wie Sie es in Versionen tun, die nicht unterstützen fs.copyFile :

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

298voto

Mike Schilling Punkte 3203

Derselbe Mechanismus, aber mit zusätzlicher Fehlerbehandlung:

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;
    }
  }
}

158voto

Mikhail Punkte 9809

Seit Node.js 8.5.0 haben wir die neue fs.copyFile y fs.copyFileSync Methoden.

Beispiel für die Verwendung:

var fs = require('fs');

// File "destination.txt" will be created or overwritten by default.
fs.copyFile('source.txt', 'destination.txt', (err) => {
    if (err) 
        throw err;
    console.log('source.txt was copied to destination.txt');
});

149voto

Timmerz Punkte 5871

Ich war nicht in der Lage, die createReadStream/createWriteStream Methode funktioniert aus irgendeinem Grund, aber die Verwendung der fs-extra npm-Modul funktionierte es auf Anhieb. Ich bin mir allerdings nicht sicher, wie groß der Leistungsunterschied ist.

npm install --save fs-extra

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

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

76voto

benweet Punkte 3595

Schnell zu schreiben und bequem zu benutzen, mit Versprechungen und Fehlermanagement:

function copyFile(source, target) {
  var rd = fs.createReadStream(source);
  var wr = fs.createWriteStream(target);
  return new Promise(function(resolve, reject) {
    rd.on('error', reject);
    wr.on('error', reject);
    wr.on('finish', resolve);
    rd.pipe(wr);
  }).catch(function(error) {
    rd.destroy();
    wr.end();
    throw error;
  });
}

Dasselbe gilt für die async/await-Syntax:

async function copyFile(source, target) {
  var rd = fs.createReadStream(source);
  var wr = fs.createWriteStream(target);
  try {
    return await new Promise(function(resolve, reject) {
      rd.on('error', reject);
      wr.on('error', reject);
      wr.on('finish', resolve);
      rd.pipe(wr);
    });
  } catch (error) {
    rd.destroy();
    wr.end();
    throw error;
  }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X