답변:
때때로 추가하는 경우을 사용할 수 있습니다 appendFile
.이 함수는 호출 될 때마다 새 파일 핸들을 만듭니다.
비동기 적으로 :
const fs = require('fs');
fs.appendFile('message.txt', 'data to append', function (err) {
if (err) throw err;
console.log('Saved!');
});
동 기적으로 :
const fs = require('fs');
fs.appendFileSync('message.txt', 'data to append');
process.exit()
바로 뒤에 fs.appendFile
있는 경우 출력이 전송되기 전에 종료 될 수 있습니다. (사용하는 return
것이 좋습니다.)
appendFileSync
. nodejs.org/api/… 그러나 비동기 작업 인 Node의 큰 이점 중 하나를 잃을 수도 있습니다. 오류가 발생했는지 확인하십시오. 아마도 일부 OS에서는 파일 핸들을 동시에 요청하면 액세스가 거부 될 수 있습니다. 확실하지 않습니다.
로그 파일에 쓰려고 할 때 (예 : 파일 끝에 데이터 추가) 절대 사용 하지 마십시오 appendFile
. appendFile
파일에 추가 한 각 데이터 조각에 대한 파일 핸들을 엽니 다. 잠시 후에 아름다운 EMFILE
오류가 발생합니다.
appendFile
사용하기 쉽지 않은 것을 추가 할 수 있습니다 WriteStream
.
예 appendFile
:
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
fs.appendFile("append.txt", index+ "\n", function (err) {
if (err) console.log(err);
});
});
console.log(new Date().toISOString());
내 컴퓨터에서 최대 8000까지 파일에 데이터를 추가하면 다음을 얻을 수 있습니다.
{ Error: EMFILE: too many open files, open 'C:\mypath\append.txt'
at Error (native)
errno: -4066,
code: 'EMFILE',
syscall: 'open',
path: 'C:\\mypath\\append.txt' }
또한 appendFile
활성화되면 기록되므로 타임 스탬프에 의해 로그가 기록되지 않습니다. 예를 들어 테스트 할 수 있으며 100000 대신 1000을 설정하면 순서는 무작위이며 파일에 대한 액세스에 따라 다릅니다.
파일에 추가하려면 다음 과 같이 쓰기 가능한 스트림 을 사용해야합니다 .
var stream = fs.createWriteStream("append.txt", {flags:'a'});
console.log(new Date().toISOString());
[...Array(10000)].forEach( function (item,index) {
stream.write(index + "\n");
});
console.log(new Date().toISOString());
stream.end();
당신이 원할 때 그것을 끝내십시오. stream.end()
기본 옵션 인 을 (를) 사용하지 않아도 AutoClose:true
되므로 프로세스가 끝나면 파일이 종료되고 너무 많은 파일을 열지 않아도됩니다 .
stream.end()
전에 실행 stream.write()
되므로 기본 옵션이므로 stream.end()
언급 하지 않았을 때 사용하지 말아야하는 AutoClose:True
이유는 무엇입니까? 사용하다.
due to asynchronous nature of Javascript
... 뭐? Array.forEach는 동기 작업입니다. JS는 동 기적입니다. 약속 및 비동기 / 대기와 같은 비동기 작업을 관리하는 몇 가지 방법을 제공합니다.
fs.appendFile
비동기 방식으로 그것을 실행하기 때문에 내가 믿는, (그냥 비동기 10000 파일 핸들을 만드는) 너무 많은 열려있는 파일에 결과를 appendFileSync
도하지, 비슷한 문제가없는 것입니다 fs.appendFile
적절한 간격 (1 초는 아마 더 충분하다)와 또는 큐잉.
createWriteStream을 사용하는 코드는 모든 쓰기에 대해 파일 설명자를 작성합니다. log.end는 쓰기 직후에 노드를 닫도록 요청하기 때문에 더 좋습니다.
var fs = require('fs');
var logStream = fs.createWriteStream('log.txt', {flags: 'a'});
// use {flags: 'a'} to append and {flags: 'w'} to erase and write a new file
logStream.write('Initial line...');
logStream.end('this is the end line');
var fs = require('graceful-fs')
것으로 알려진 일부 문제를 해시했습니다. 자세한 내용은 문서 를 참조하십시오.
fs.createWriteStream
경우을 사용하십시오 flags
. 당신이 사용하는 경우 fs.writeFile
다음이다 flag
. 자세한 정보는 Node JS Docs-파일 시스템 을 참조하십시오.
또한 기존 파일에 데이터를 추가하기 위해 appendFile
플래그를 전달할 수도 writeFile
있습니다.
fs.writeFile('log.txt', 'Hello Node', {'flag':'a'}, function(err) {
if (err) {
return console.error(err);
}
});
플래그 'a'를 전달하면 파일 끝에 데이터가 추가됩니다.
fs.createWriteStream
경우을 사용하십시오 flags
. 당신이 사용하는 경우 fs.writeFile
다음이다 flag
. 자세한 정보는 Node JS Docs-파일 시스템 을 참조하십시오.
그것을 열고 나서 써야합니다.
var fs = require('fs'), str = 'string to append to file';
fs.open('filepath', 'a', 666, function( e, id ) {
fs.write( id, 'string to append to file', null, 'utf8', function(){
fs.close(id, function(){
console.log('file closed');
});
});
});
다음은 매개 변수를 설명하는 데 도움이되는 몇 가지 링크입니다.
편집 :이 답변은 더 이상 유효하지 않습니다 . 추가 하려면 새로운 fs.appendFile 메소드를 살펴보십시오 .
fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
fs.closeSync(fd)
파일에 한 줄씩 로그를 작성하는 쉽고 스트레스없는 방법을 원한다면 fs-extra를 권장합니다 .
const os = require('os');
const fs = require('fs-extra');
const file = 'logfile.txt';
const options = {flag: 'a'};
async function writeToFile(text) {
await fs.outputFile(file, `${text}${os.EOL}`, options);
}
writeToFile('First line');
writeToFile('Second line');
writeToFile('Third line');
writeToFile('Fourth line');
writeToFile('Fifth line');
노드 v8.9.4로 테스트되었습니다.
나의 접근 방식은 다소 특별하다. 나는 기본적으로 WriteStream
솔루션을 사용 하지만 실제로를 사용하여 fd를 '클로징'하지 않습니다 stream.end()
. 대신 cork
/를 사용 uncork
합니다. 이것은 RAM 사용량이 적다는 이점을 얻었으며 (누구에게나 중요한 경우) 로깅 / 레코딩에 사용하는 것이 더 안전하다고 생각합니다 (원래의 사용 사례).
다음은 매우 간단한 예입니다. 방금 for
쇼케이스에 의사 루프를 추가 했습니다. 제작 코드에서 웹 소켓 메시지를 기다리고 있습니다.
var stream = fs.createWriteStream("log.txt", {flags:'a'});
for(true) {
stream.cork();
stream.write("some content to log");
process.nextTick(() => stream.uncork());
}
uncork
다음 틱에서 데이터를 파일로 플러시합니다.
필자의 시나리오에서는 다양한 크기에서 초당 최대 200 회의 쓰기가 최고입니다. 그러나 야간에는 분당 소수의 쓰기 만 필요합니다. 코드는 피크 타임에도 안정적인 성능을 발휘합니다.
오픈 플래그 제어가 때로는 유용하기 때문에이 제안 만 제공합니다. 예를 들어, 기존 파일을 먼저 잘라낸 다음 일련의 쓰기를 추가 할 수 있습니다.이 경우 파일을 열 때 'w'플래그를 사용 모든 쓰기가 완료 될 때까지 닫지 마십시오. 물론 appendFile은 다음에 오는 것일 수 있습니다 :-)
fs.open('log.txt', 'a', function(err, log) {
if (err) throw err;
fs.writeFile(log, 'Hello Node', function (err) {
if (err) throw err;
fs.close(log, function(err) {
if (err) throw err;
console.log('It\'s saved!');
});
});
});
사용 fs.appendFile
또는 것은 fsPromises.appendFile
당신이 파일에 무언가를 추가 할 필요가있을 때 가장 빠르고 가장 강력한 옵션입니다.
제안 된 답변 중 일부와 달리 파일 경로가 appendFile
함수에 제공되면 실제로 닫힙니다 . 파일 핸들을 전달할 때만 파일 핸들을 fs.open()
닫을 때주의해야합니다.
파일에서 50,000 줄 이상으로 시도했습니다.
예 :
(async () => {
// using appendFile.
const fsp = require('fs').promises;
await fsp.appendFile(
'/path/to/file', '\r\nHello world.'
);
// using apickfs; handles error and edge cases better.
const apickFileStorage = require('apickfs');
await apickFileStorage.writeLines(
'/path/to/directory/', 'filename', 'Hello world.'
);
})();
참조 : https://github.com/nodejs/node/issues/7560
예제 실행 : https://github.com/apickjs/apickFS/blob/master/writeLines.js
전체 스크립트는 다음과 같습니다. 파일 이름을 입력하고 실행하면 작동합니다! 다음 은 스크립트 배후의 논리에 대한 비디오 자습서 입니다.
var fs = require('fs');
function ReadAppend(file, appendFile){
fs.readFile(appendFile, function (err, data) {
if (err) throw err;
console.log('File was read');
fs.appendFile(file, data, function (err) {
if (err) throw err;
console.log('The "data to append" was appended to file!');
});
});
}
// edit this with your file names
file = 'name_of_main_file.csv';
appendFile = 'name_of_second_file_to_combine.csv';
ReadAppend(file, appendFile);
가장 쉬운 방법은
const fs = require('fs');
fs.appendFileSync('file.txt', 'message to append into file');
appendFileSync
솔루션 을 제공하는 최고의 답변을 확인 했습니까 ?
denysonique의 답변 외에도 appendFile
콜백 전달 대신 약속이 반환되는 경우 NodeJS 의 비동기 유형 및 기타 비동기 메소드가 사용되는 경우가 있습니다. 이를 위해서는 promisify
HOF로 함수를 감싸 거나 promise 네임 스페이스에서 비동기 함수를 가져와야합니다.
const { appendFile } = require('fs').promises;
await appendFile('path/to/file/to/append', dataToAppend, optionalOptions);
도움이 되었기를 바랍니다.