LoginSignup
0
0

More than 3 years have passed since last update.

Node.js でローカルファイルに書き込む

Last updated at Posted at 2021-02-21

「いまさらこんな記事かよ」と思われるかもしれませんが意外と落とし穴にハマる事が多いのでケース毎にまとめておきます。

一気に書き込む場合

エラーチェックの必要がなくて、データが書き込まれる間ユーザーを待たせることができる場合。

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 を使うこともできます。

経験的には appendFile を使う場合より少し高速です。

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()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0