[javascript] node.js에서 파일을 복사하는 가장 빠른 방법

내가 작업중 인 프로젝트 (node.js)는 파일 시스템 (복사 / 읽기 / 쓰기 등)으로 많은 작업을 의미합니다. 어떤 방법이 가장 빠른지 알고 싶습니다. 기꺼이 조언을 구하십시오. 감사.



답변

이것은 스트림을 사용하여 한 줄의 코드로 파일을 복사하는 좋은 방법입니다.

var fs = require('fs');

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

노드 v8.5.0에서 copyFile이 추가되었습니다.

const fs = require('fs');

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


답변

동일한 메커니즘이지만 오류 처리가 추가됩니다.

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


답변

createReadStream/createWriteStream어떤 이유로 든 메소드를 작동 시킬 수 없었지만 fs-extranpm 모듈을 사용하면 즉시 작동했습니다. 그래도 성능 차이는 확실하지 않습니다.

fs-extra

npm install --save fs-extra

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

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


답변

Node.js 8.5.0부터 새로운 fs.copyFilefs.copyFileSync 메소드가 있습니다.

사용 예 :

var fs = require('fs');

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


답변

약속 및 오류 관리 기능으로 빠르고 쓰기 쉽고 사용하기 편리합니다.

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

async / await 구문과 동일합니다.

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


답변

일반적으로 비동기 파일 작업을 피하는 것이 좋습니다. 다음은 짧은 (즉, 오류 처리 없음) 동기화 예입니다.

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


답변

오류 처리기를위한 바로 가기가 포함 된 오류 처리 기능이있는 Mike Schilling 솔루션.

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