[node.js] 노드에서 파일에 추가하는 방법?

로그 파일에 문자열 을 추가 하려고 합니다. 그러나 writeFile은 문자열을 쓰기 전에 매번 내용을 지 웁니다.

fs.writeFile('log.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('It\'s saved!');
}); // => message.txt erased, contains only 'Hello Node'

이 방법을 쉽게 수행하는 방법을 알고 있습니까?



답변

때때로 추가하는 경우을 사용할 수 있습니다 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');

그러나 동일한 파일에 반복적으로 추가하는 경우 파일 핸들재사용하는 것이 훨씬 좋습니다 .


답변

로그 파일에 쓰려고 할 때 (예 : 파일 끝에 데이터 추가) 절대 사용 하지 마십시오 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되므로 프로세스가 끝나면 파일이 종료되고 너무 많은 파일을 열지 않아도됩니다 .


답변

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


답변

또한 기존 파일에 데이터를 추가하기 위해 appendFile플래그를 전달할 수도 writeFile있습니다.

fs.writeFile('log.txt', 'Hello Node',  {'flag':'a'},  function(err) {
    if (err) {
        return console.error(err);
    }
});

플래그 ‘a’를 전달하면 파일 끝에 데이터가 추가됩니다.


답변

그것을 열고 나서 써야합니다.

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 메소드를 살펴보십시오 .


답변

Node.js 0.8에는 fs.appendFile다음 이 있습니다 .

fs.appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
});

선적 서류 비치


답변

fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
fs.closeSync(fd)