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?

2voto

chpio Punkte 715

Für schnelle Kopien sollten Sie die fs.constants.COPYFILE_FICLONE Flagge. Es erlaubt (bei Dateisystemen, die dies unterstützen), den Inhalt der Datei nicht wirklich zu kopieren. Es wird lediglich ein neuer Dateieintrag erstellt, der jedoch auf eine Copy-on-Write "Klon" der Quelldatei.

Nichts/weniger zu tun ist der schnellste Weg, etwas zu tun ;)

https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback

let fs = require("fs");

fs.copyFile(
  "source.txt",
  "destination.txt",
  fs.constants.COPYFILE_FICLONE,
  (err) => {
    if (err) {
      // TODO: handle error
      console.log("error");
    }
    console.log("success");
  }
);

Stattdessen Versprechen verwenden:

let fs = require("fs");
let util = require("util");
let copyFile = util.promisify(fs.copyFile);

copyFile(
  "source.txt",
  "destination.txt",
  fs.constants.COPYFILE_FICLONE
)
  .catch(() => console.log("error"))
  .then(() => console.log("success"));

1voto

Xin Punkte 27823

Verwenden Sie die integrierte Kopierfunktion von Node.js

Es bietet sowohl eine asynchrone als auch eine synchrone Version:

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

_fs.copyFileSync(src, dest[, mode])_

0voto

Aryan Punkte 3054

Sie können dies mit der Option fs-extra Modul sehr leicht:

const fse = require('fs-extra');

let srcDir = 'path/to/file';
let destDir = 'pat/to/destination/directory';

fse.moveSync(srcDir, destDir, function (err) {

    // To move a file permanently from a directory
    if (err) {
        console.error(err);
    } else {
        console.log("success!");
    }
});

Oder

fse.copySync(srcDir, destDir, function (err) {

     // To copy a file from a directory
     if (err) {
         console.error(err);
     } else {
         console.log("success!");
     }
});

0voto

Roaders Punkte 4155

Ich habe ein kleines Dienstprogramm geschrieben, um die verschiedenen Methoden zu testen:

https://www.npmjs.com/package/copy-speed-test

führen Sie es mit

npx copy-speed-test --source someFile.zip --destination someNonExistentFolder

Es führt eine native Kopie mit child_process.exec() durch, eine Dateikopie mit fs.copyFile und es verwendet createReadStream mit einer Vielzahl von verschiedenen Puffergrößen (Sie können die Puffergrößen ändern, indem Sie sie auf der Kommandozeile übergeben. führen Sie npx copy-speed-test -h für weitere Informationen aus).

-1voto

mpen Punkte 253762

Mikes Lösung sondern mit Versprechungen:

const FileSystem = require('fs');

exports.copyFile = function copyFile(source, target) {
    return new Promise((resolve,reject) => {
        const rd = FileSystem.createReadStream(source);
        rd.on('error', err => reject(err));
        const wr = FileSystem.createWriteStream(target);
        wr.on('error', err => reject(err));
        wr.on('close', () => resolve());
        rd.pipe(wr);
    });
};

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