218 votes

Copier un dossier de façon récursive dans Node.js

Existe-t-il un moyen plus simple de copier un dossier et tout son contenu sans effectuer manuellement une séquence de fs.readir , fs.readfile , fs.writefile de manière récursive ?

Je me demande simplement s'il ne me manque pas une fonction qui fonctionnerait idéalement comme ceci :

fs.copy("/path/to/source/folder", "/path/to/destination/folder");

13voto

Freddy Daniel Points 201

Je sais que de nombreuses réponses se trouvent déjà ici, mais personne n'a répondu de manière simple à cette question.

Concernant fs-exra documentation officielle vous pouvez le faire très facilement.

const fs = require('fs-extra')

// Copy file
fs.copySync('/tmp/myfile', '/tmp/mynewfile')

// Copy directory, even if it has subdirectories or files
fs.copySync('/tmp/mydir', '/tmp/mynewdir')

9voto

Shahar Points 575

J'ai créé un petit exemple de travail qui copie un dossier source vers un autre dossier de destination en quelques étapes seulement (sur la base de La réponse de shift66 en utilisant ncp) :

Étape 1 - Installer le module ncp :

npm install ncp --save

Etape 2 - créer copy.js (modifier le srcPath et destPath à ce dont vous avez besoin) :

var path = require('path');
var ncp = require('ncp').ncp;

ncp.limit = 16;

var srcPath = path.dirname(require.main.filename); // Current folder
var destPath = '/path/to/destination/folder'; // Any destination folder

console.log('Copying files...');
ncp(srcPath, destPath, function (err) {
  if (err) {
    return console.error(err);
  }
  console.log('Copying files complete.');
});

Étape 3 - Exécution

node copy.js

7voto

allx Points 35

Celui avec lien symbolique soutien :

const path = require("path");
const {
  existsSync,
  mkdirSync,
  readdirSync,
  lstatSync,
  copyFileSync,
  symlinkSync,
  readlinkSync,
} = require("fs");

export function copyFolderSync(src, dest) {
  if (!existsSync(dest)) {
    mkdirSync(dest);
  }

  readdirSync(src).forEach((entry) => {
    const srcPath = path.join(src, entry);
    const destPath = path.join(dest, entry);
    const stat = lstatSync(srcPath);

    if (stat.isFile()) {
      copyFileSync(srcPath, destPath);
    } else if (stat.isDirectory()) {
      copyFolderSync(srcPath, destPath);
    } else if (stat.isSymbolicLink()) {
      symlinkSync(readlinkSync(srcPath), destPath);
    }
  });
}

4voto

jmort253 Points 16929

Comme je ne construis qu'un simple script de Node.js, je ne voulais pas que les utilisateurs du script aient besoin d'importer un tas de modules et de dépendances externes, alors j'ai mis ma casquette de réflexion et j'ai fait une recherche pour exécuter des commandes à partir du shell Bash.

Cet extrait de code Node.js copie récursivement un dossier appelé node-webkit.app vers un dossier appelé build :

child = exec("cp -r node-webkit.app build", function(error, stdout, stderr) {
    sys.print("stdout: " + stdout);
    sys.print("stderr: " + stderr);
    if(error !== null) {
        console.log("exec error: " + error);
    } else {

    }
});

Merci à Lance Pollard à la dzone pour m'avoir fait commencer.

L'extrait ci-dessus est limité aux plateformes Unix, comme macOS et Linux, mais une technique similaire peut fonctionner sous Windows.

4voto

Luckylooke Points 168

Mallikarjun M, merci !

fs-extra a fait la chose et il peut même retourner un Promesse si vous ne fournissez pas de callback ! :)

const path = require('path')
const fs = require('fs-extra')

let source = path.resolve( __dirname, 'folderA')
let destination = path.resolve( __dirname, 'folderB')

fs.copy(source, destination)
  .then(() => console.log('Copy completed!'))
  .catch( err => {
    console.log('An error occurred while copying the folder.')
    return console.error(err)
  })

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