Skip to content

Node.js におけるファイルディスクリプタの扱い

ファイルシステム上のファイルとやり取りするには、まずファイルディスクリプタを取得する必要があります。ファイルディスクリプタとは、開いているファイルへの参照であり、fsモジュールが提供するopen()メソッドを使用してファイルを開くことで返される番号(fd)です。この番号(fd)は、オペレーティングシステムにおいて開いているファイルを一意に識別します。

ファイルを開く

CommonJS (CJS)

javascript
const fs = require('node:fs')
fs.open('/Users/joe/test.txt', 'r', (err, fd) => {
  // fdはファイルディスクリプタです
})

fs.open()呼び出しの第 2 パラメータとして使用されている'r'に注目してください。このフラグは、読み取りのためにファイルを開くことを意味します。一般的に使用される他のフラグは以下のとおりです。

フラグ説明
'w+'読み書きのためにファイルを開きます。ストリームの位置はファイルの先頭に設定されます。
'a+'読み書きのためにファイルを開き、ストリームの位置をファイルの末尾に設定します。

fs.openSyncメソッドを使用してファイルを開くこともできます。これは、コールバックで提供する代わりに、ファイルディスクリプタを返します。

javascript
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)

javascript
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 ベースの関数に変換する例を以下に示します。

javascript
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 ドキュメント を参照してください。