「いまさらこんな記事かよ」と思われるかもしれませんが意外と落とし穴にハマる事が多いのでケース毎にまとめておきます。
https://nodejs.org/api/fs.html
一気に書き込む場合
エラーチェックの必要がなくて、データが書き込まれる間ユーザーを待たせることができる場合。
writeFileSyncを使います。
const fs = require( 'fs' )
fs.writeFileSync( 'some.file', 'abc' )
エラーチェックが必要であるか、データが書き込まれる間ユーザーを待たせることができない場合。
writeFileを使います。
const fs = require( 'fs' )
fs.writeFile( 'some.file', 'very long string', er => { if ( er ) throw er } )
3番目の引数にはエラーが渡ってきます。例えばファイルを/some.file
のようにしてルートディレクトリに作ろうとすると以下のようなものが渡ってきます。
[Error: EROFS: read-only file system, open '/some.file'] {
errno: -30,
code: 'EROFS',
syscall: 'open',
path: '/some.file'
}
fs.writeFile の呼び出しが終了した時点ではファイルの書き込みは終了していませんが、3番目の引数に渡したコールバックが呼ばれた時点では、ファイルの書き込みが終了しています。
const fs = require( 'fs' )
const PATH = 'some.file'
fs.writeFile( PATH, 'very long string', () => console.log( 'コールバックの中', fs.statSync( PATH ).size ) )
console.log( 'writeFileの直後', fs.statSync( PATH ).size )
上のようにfs.statSyncを使ってファイルのサイズを取得してると結果は以下のようになります。
writeFileの直後 0
コールバックの中 16
逐次に書き込む場合
エラーチェックの必要がなくて、データが書き込まれる間ユーザーを待たせることができる場合。
appendFileSyncを使います。
const fs = require( 'fs' )
const PATH = 'some.file'
fs.writeFileSync( PATH, '' )
fs.appendFileSync( PATH, 'abc' )
fs.appendFileSync( PATH, 'abc' )
エラーチェックが必要であるか、データが書き込まれる間ユーザーを待たせることができない場合。
appendFileを使います。
const fs = require( 'fs' )
const PATH = 'some.file'
fs.writeFile( PATH, '', er => { if ( er ) throw er } )
fs.appendFile( PATH, 'very long string', er => { if ( er ) throw er } )
fs.appendFile( PATH, 'very long string', er => { if ( er ) throw er } )
WriteableStream.writeを使うこともできます。
const fs = require( 'fs' )
const PATH = 'some.file'
const writer = fs.createWriteStream( PATH )
writer.on( 'close', er => { if ( er ) throw er } )
writer.write( 'very long string', er => { if ( er ) throw er } )
writer.write( 'very long string', er => { if ( er ) throw er } )
writer.end()