Node.js におけるファイルディスクリプタの扱い
ファイルシステム上のファイルとやり取りするには、まずファイルディスクリプタを取得する必要があります。ファイルディスクリプタとは、開いているファイルへの参照であり、fs
モジュールが提供するopen()
メソッドを使用してファイルを開くことで返される番号(fd)です。この番号(fd)は、オペレーティングシステムにおいて開いているファイルを一意に識別します。
ファイルを開く
CommonJS (CJS)
const fs = require('node:fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
// fdはファイルディスクリプタです
})
fs.open()
呼び出しの第 2 パラメータとして使用されている'r'
に注目してください。このフラグは、読み取りのためにファイルを開くことを意味します。一般的に使用される他のフラグは以下のとおりです。
フラグ | 説明 |
---|---|
'w+' | 読み書きのためにファイルを開きます。ストリームの位置はファイルの先頭に設定されます。 |
'a+' | 読み書きのためにファイルを開き、ストリームの位置をファイルの末尾に設定します。 |
fs.openSync
メソッドを使用してファイルを開くこともできます。これは、コールバックで提供する代わりに、ファイルディスクリプタを返します。
const fs = require('node:fs')
try {
const fd = fs.openSync('/Users/joe/test.txt', 'r')
} catch (err) {
console.error(err)
}
操作の実行
いずれかの方法でファイルディスクリプタを取得したら、fs.close()
の呼び出しなど、ファイルシステムとやり取りする多くの操作を実行できます。
fsPromises の使用
fs/promises
モジュールが提供する、Promise ベースのfsPromises.open
メソッドを使用してファイルを開くこともできます。fs/promises
モジュールは、Node.js v14 以降で使用可能です。v14 より前、v10 以降では、代わりにrequire('fs').promises
を使用できます。v10 より前、v8 以降では、util.promisify
を使用してfs
メソッドを Promise ベースのメソッドに変換できます。
ES Modules (MJS)
import fs from 'node:fs/promises'
async function run() {
const fileHandle = await fs.open('example.txt', 'r')
try {
filehandle = await fs.open('/Users/joe/test.txt', 'r')
console.log(filehandle.fd)
console.log(await filehandle.readFile({ encoding: 'utf8' }))
} finally {
await fileHandle.close()
}
}
run().catch(console.error)
util.promisify の例
util.promisify
を使用して fs.open
を Promise ベースの関数に変換する例を以下に示します。
const fs = require('node:fs')
const util = require('node:util')
const open = util.promisify(fs.open)
open('test.txt', 'r')
.then(fd => {
// ファイルディスクリプタを使用する
})
.catch(err => {
// エラーを処理する
})
fs/promises
モジュールに関する詳細については、fs/promises API ドキュメント を参照してください。