671

ログ ファイルに文字列を追加しようとしています。ただし、 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'

これを簡単な方法で行う方法はありますか?

4

18 に答える 18

1028

ときどき追加する場合は、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');

ただし、同じファイルに繰り返し追加する場合は、ファイル ハンドルを再利用する方がはるかに優れています。

于 2012-06-29T19:06:56.090 に答える
337

ログ ファイルに書き込みたい場合、つまりファイルの末尾にデータを追加する場合は、絶対に使用しない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であるため、プロセスが終了するとファイルが終了し、ファイルを開きすぎないようにします。

于 2017-04-12T12:56:12.853 に答える
149

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');
于 2012-03-21T21:01:26.580 に答える
24

それを開いてから書き込む必要があります。

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メソッドを調べて追加してください。

于 2010-08-11T19:27:10.137 に答える
14

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

ドキュメンテーション

于 2012-11-04T01:12:31.847 に答える
13

私のアプローチはかなり特殊です。私は基本的にWriteStreamソリューションを使用しますが、を使用して fd を実際に「閉じる」ことはしませんstream.end()。代わりにcork/を使用しますuncork。これには、RAM 使用量が少ないという利点があり (それが誰にとっても重要な場合)、ログ/記録に使用する方が安全だと思います (私の元の使用例)。

以下は非常に簡単な例です。ショーケース用の疑似forループを追加したことに注意してください。実動コードでは、websocket メッセージを待っています。

var stream = fs.createWriteStream("log.txt", {flags:'a'});
for(true) {
  stream.cork();
  stream.write("some content to log");
  process.nextTick(() => stream.uncork());
}

uncork次のティックでデータをファイルにフラッシュします。

私のシナリオでは、さまざまなサイズで毎秒最大 200 回の書き込みのピークがあります。ただし、夜間は 1 分あたり数回の書き込みしか必要ありません。コードは、ピーク時でも非常に信頼性の高い動作をしています。

于 2020-03-08T10:23:31.730 に答える
5

ファイルにログを 1 行ずつ書き込む簡単でストレスのない方法が必要な場合は、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');

Node v8.9.4 でテスト済み。

于 2018-03-26T14:54:00.413 に答える
4
fd = fs.openSync(path.join(process.cwd(), 'log.txt'), 'a')
fs.writeSync(fd, 'contents to append')
fs.closeSync(fd)
于 2012-07-17T05:22:18.067 に答える
3

jfileパッケージの使用:

myFile.text+='\nThis is new line to be appended'; //myFile=new JFile(path);
于 2016-07-20T09:22:10.790 に答える
3

この提案をするのは、open フラグの制御が役立つ場合があるからです。たとえば、最初に既存のファイルを切り捨ててから、一連の書き込みを追加したい場合がありますこの場合、ファイルを開くときに '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!');
      });
    });
  });
于 2016-05-31T08:28:00.923 に答える
0

これが完全なスクリプトです。ファイル名を入力して実行すると、動作するはずです! これは、スクリプトの背後にあるロジックに関するビデオ チュートリアルです。

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);
于 2015-08-17T01:59:11.513 に答える