[javascript] node.js에서 폴더를 재귀 적으로 복사

수동의 순서를하지 않고 폴더와 모든 콘텐츠를 복사 할 수있는 쉬운 방법이 있습니까 fs.readir, fs.readfile, fs.writefile재귀는?

이상적으로 이와 같이 작동하는 기능이 누락되어 있는지 궁금합니다.

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



답변

ncp 모듈을 사용할 수 있습니다 . 나는 이것이 당신이 필요로 생각합니다


답변

이것은 추가 모듈 없이이 문제를 해결하는 나의 접근 방식입니다. 내장 fspath모듈 만 사용하십시오 .

참고 : 이것은 fs의 읽기 / 쓰기 기능을 사용하므로 메타 데이터 (생성 시간 등)를 복사하지 않습니다. 노드 8.5부터는 copyFileSyncOS 복사 기능을 호출하여 메타 데이터를 복사 하는 기능이 있습니다. 아직 테스트하지는 않았지만 교체하는 것이 좋습니다. ( https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flags 참조 )

var fs = require('fs');
var path = require('path');

function copyFileSync( source, target ) {

    var targetFile = target;

    //if target is a directory a new file with the same name will be created
    if ( fs.existsSync( target ) ) {
        if ( fs.lstatSync( target ).isDirectory() ) {
            targetFile = path.join( target, path.basename( source ) );
        }
    }

    fs.writeFileSync(targetFile, fs.readFileSync(source));
}

function copyFolderRecursiveSync( source, target ) {
    var files = [];

    //check if folder needs to be created or integrated
    var targetFolder = path.join( target, path.basename( source ) );
    if ( !fs.existsSync( targetFolder ) ) {
        fs.mkdirSync( targetFolder );
    }

    //copy
    if ( fs.lstatSync( source ).isDirectory() ) {
        files = fs.readdirSync( source );
        files.forEach( function ( file ) {
            var curSource = path.join( source, file );
            if ( fs.lstatSync( curSource ).isDirectory() ) {
                copyFolderRecursiveSync( curSource, targetFolder );
            } else {
                copyFileSync( curSource, targetFolder );
            }
        } );
    }
}


답변

내용과 함께 폴더 복사를 지원하는 일부 모듈이 있습니다. 가장 인기있는 것은 렌치입니다

// Deep-copy an existing directory
wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up');

대안은 node-fs-extra입니다.

fs.copy('/tmp/mydir', '/tmp/mynewdir', function (err) {
  if (err) {
    console.error(err);
  } else {
    console.log("success!");
  }
}); //copies directory, even if it has subdirectories or files


답변

디렉토리를 재귀 적으로 복사하는 함수는 다음과 같습니다.

const fs = require("fs")
const path = require("path")

/**
 * Look ma, it's cp -R.
 * @param {string} src The path to the thing to copy.
 * @param {string} dest The path to the new copy.
 */
var copyRecursiveSync = function(src, dest) {
  var exists = fs.existsSync(src);
  var stats = exists && fs.statSync(src);
  var isDirectory = exists && stats.isDirectory();
  if (isDirectory) {
    fs.mkdirSync(dest);
    fs.readdirSync(src).forEach(function(childItemName) {
      copyRecursiveSync(path.join(src, childItemName),
                        path.join(dest, childItemName));
    });
  } else {
    fs.copyFileSync(src, dest);
  }
};


답변

fs-extra때 나를 위해 일한 ncpwrench하회 :

https://www.npmjs.com/package/fs-extra


답변

Linux / unix OS의 경우 쉘 구문을 사용할 수 있습니다

const shell = require('child_process').execSync ;

const src= `/path/src`;
const dist= `/path/dist`;

shell(`mkdir -p ${dist}`);
shell(`cp -r ${src}/* ${dist}`);

그게 다야!


답변

fs-extra 모듈은 매력처럼 작동합니다.

fs-extra 설치

$ npm install fs-extra

다음은 소스 디렉토리를 대상 디렉토리에 복사하는 프로그램입니다.

// include fs-extra package
var fs = require("fs-extra");

var source = 'folderA'
var destination = 'folderB'

// copy source folder to destination
fs.copy(source, destination, function (err) {
    if (err){
        console.log('An error occured while copying the folder.')
        return console.error(err)
    }
    console.log('Copy completed!')
});

참고 문헌

fs-extra : https://www.npmjs.com/package/fs-extra

예 : NodeJS 튜토리얼폴더 Node.js를 복사