Node.jsのfs.writeFilefs.writeFileSyncの使い方の例を分かりやすく簡単に説明していきます。fsはNode.jsでファイルを書き込むために使うライブラリです。

コマンドラインとnode.jsの環境の作り方

目次

fs.writeFileSyncの使い方

まずは使い方が分かりやすいfs.writeFileSyncから説明します。

最も簡単な使い方は次の通りです。

sample.js
1
2
3
4
5
// node.js v7.10.0 以降で動作します
// 1. ライブラリを読み込む
const fs = require('fs')
// 2. ファイルを書き込む
fs.writeFileSync( "output.txt" , "テキストファイルの中身" )

上記のサンプルコードではoutput.txtというテキストファイルを、Node.jsから書き出しています。流れとしては次の通りです。

  1. ライブラリを読み込む

    まずはfsというライブラリを読み込みます。今回はファイルの読み書きを行うことができるfsを読み込んでいます。

  2. ファイルを書き込む

    fsライブラリのメソッド(命令)であるfs.writeFileSync( 書き出すファイルパス , データ )を使って、ファイルを書き込んでいます。

上記のコードを実行すると、書き出したファイルoutput.txtには、テキストファイルの中身という文字が保存されます。

コードの実行は以下のようなコマンドで実行する事ができます。

bash
1
$ node sample.js

fs.writeFileの使い方

次にfs.writeFileを使ってみましょう。fs.writeFileは前項で説明したfs.writeFileSyncと同じようにファイルの書き込みができます。

最も単純な使い方は次の通りです。

sample.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// node.js v7.10.0 以降で動作します
// 1. ライブラリを読み込む
var fs = require('fs')
// 2. ファイルを書き込む
fs.writeFile( "output.txt" , "テキストファイルの中身2" , (err) => {
// 書き出しに失敗した場合
if(err){
console.log("エラーが発生しました。" + err)
throw err
}
// 書き出しに成功した場合
else{
console.log("ファイルが正常に書き出しされました")
}
});

上記のサンプルコードでは、前項と同様にoutput.txtというテキストファイルを、Node.jsから書き出しています。流れとしては次の通りです。

  1. ライブラリを読み込む

    まずはfsというライブラリを読み込みます。今回はファイルの読み書きを行うことができるfsを読み込んでいます。

  2. ファイルを書き込む

    fsライブラリのメソッド(命令)であるfs.writeFile( 書き出すファイルパス , データ ,コールバック )を使って、ファイルを書き込んでいます。

前項で説明したfs.writeFileSyncと大きく違うのは、書き出しの結果(失敗または成功)を受けて、処理を分けることができる所です。

fs.writeFileはコールバックと言われる関数を用意する必要があるのですが、その関数でerrという引数を受けることができます。errには、

  • 書き込みに問題が発生した時

    エラーメッセージが入っています

  • 書き込みが成功した時

    内容はnull(=空)です

上記のように、書き出しの結果に応じて内容が変化します。そこでif(err){ 〜のような条件で、書き込みが成功したか失敗したかを判定することができるようになります。

同期と非同期

また、fs.writeFile()は書き込みの結果を受けてから、コールバック関数で処理を行うことができるため非同期処理と呼ばれています。

それに対して、前項のfs.writeFileSync()は、この処理が完了するまで以降の処理を止めるため同期処理と呼ばれています。

それでは、fs.writeFile()fs.writeFileSync()を順番に記述していき、それぞれの最後にメッセージを表示させるコードを書いてみましょう。

sample.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// node.js v7.10.0 以降で動作します

const fs = require('fs')

// 同期処理は処理が完了してから、後続の処理が実行される
fs.writeFileSync( "output.txt" , "テキストファイルの中身" )
console.log("1つ目の書き出し処理が終わった") // 1番目に表示されるメッセージ

// 非同期処理は処理が完了してからコールバック関数の中の処理が実行される
// ただし、後続の処理は、非同期処理が完了したタイミングと関係なく実行される
fs.writeFile( "output.txt" , "テキストファイルの中身2" , (err) => {
if(err){
console.log("エラーが発生しました。" + err)
throw err
}
else{
console.log("ファイルが正常に書き出しされました") // 3番目に表示されるメッセージ
}
});
console.log("2つ目の書き出し処理が終わった") // 2番目に表示されるメッセージ

上記のコードを実行すると、2つ目の書き出し処理が終わったというメッセージの後でファイルが正常に書き出しされましたというメッセージが表示されます。

bash
1
2
3
4
$ node sample.js
1つめの書き出し処理が終わった
2つめの書き出し処理が終わった
ファイルが正常に書き出しされました

つまり、fs.writeFileではconsole.log("2つ目の書き出し処理が終わった")が先に呼び出され、コールバック関数の中にあるconsole.log("ファイルが正常に書き出しされました")が後から呼び出されるケースもあるので、注意が必要です。

行いたい処理に応じて使い分けしていきましょう。