情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでテキストファイルやバイナリファイルにデータを追記する

2016/08/09

テキストファイルやバイナリファイルにデータを追記するには非同期的に追記する方法と同期的に追記する方法の2つがあります。

なお、テキストファイルへのデータの追記において対応している文字コードはバッファが対応している文字コードと同じです。

対応している文字コードに関しては下の記事の「文字コード」の項を参照してください。

非同期的な追記

テキストファイルやバイナリファイルにデータを非同期的に追記するにはfs.appendFile関数を使用します。

var fs = require('fs');

fs.appendFile('xxx', 'yyy', 'utf-8', function (err) {
});
//or
fs.appendFile('xxx', buf, function (err) {
});

第1引数にファイルのパスを指定します。

第2引数にファイルに追記するデータを指定します。文字列かバッファを指定します。

第3引数にテキストファイルの文字コードを指定します。バイナリファイルにデータを追記する場合には指定しません

第4引数にコールバック関数を指定します。この関数の第1引数はエラーオブジェクトです。

なお、ファイルが存在しない場合には新規作成されます。

同期的な追記

テキストファイルやバイナリファイルにデータを同期的に追記するにはfs.appendFileSync関数を使用します。

fs.appendFileSync('xxx', 'yyy', 'utf-8');
//or
fs.appendFileSync('xxx', buf);

第1引数にファイルのパスを指定します。

第2引数にファイルに追記するデータを指定します。文字列かバッファを指定します。

第3引数にテキストファイルの文字コードを指定します。バイナリファイルにデータを追記する場合には指定しません

なお、ファイルが存在しない場合には新規作成されます。

使い分け

原則的にはfs.appendFile関数を使用するべきであり、特に理由がないならfs.appendFileSync関数は使用するべきではありません。

これは、ファイルへのアクセスは非常に時間の掛かる処理であるためです。ファイルへのアクセスを同期的に行うとアクセスが完了するまでプログラムは待機状態となり、他の処理を行うことができません。長い時間プログラムが待機状態になると様々な問題を引き起こす可能性があります(このような現象をスターベーションと言います)。

サンプルコード1

fs.appendFile関数の使用例です。

3つ目のコマンドライン引数として与えられたテキストファイルにデータを非同期的に追記します。

fs-appendfile-text.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

fs.appendFile(process.argv[2], 'テキストファイルに追加で文字列を書き込んでみます。', 'utf-8', function (err) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('finished!!');
    }
});

実行結果

正しくテキストファイルにデータが追記されていることが分かります。

C:\work\node>type textfile.txt
テキストファイルに文字列を書き込んでみます。
C:\work\node>node fs-appendfile-text.js textfile.txt
finished!!

C:\work\node>type textfile.txt
テキストファイルに文字列を書き込んでみます。テキストファイルに追加で文字列を書き込んでみます。

サンプルコード2

fs.appendFileSync関数の使用例です。

3つ目のコマンドライン引数として与えられたテキストファイルにデータを同期的に追記します。

fs-appendfilesync-text.js

var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

try {
    fs.appendFileSync(process.argv[2], 'テキストファイルに追加で文字列を書き込んでみます。', 'utf-8');
}
catch (err) {
    console.error(err);
    process.exit(1);
}

console.log('finished!!');

実行結果

正しくテキストファイルにデータが追記されていることが分かります。

C:\work\node>type textfile.txt
これはテキストファイルの内容です。
C:\work\node>node fs-appendfilesync-text.js textfile.txt
finished!!

C:\work\node>type textfile.txt
これはテキストファイルの内容です。テキストファイルに追加で文字列を書き込んでみます。

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js