내가 작업중 인 프로젝트 (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-extra
npm 모듈을 사용하면 즉시 작동했습니다. 그래도 성능 차이는 확실하지 않습니다.
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.copyFile 및 fs.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;
}
}
}