ファイルシステム#

安定性: 2 - 安定

ソースコード: lib/fs.js

node:fs モジュールは、標準の POSIX 関数をモデルにした方法でファイルシステムと対話できるようにします。

Promise ベースの API を使用するには

import * as fs from 'node:fs/promises';const fs = require('node:fs/promises');

コールバックおよび同期 API を使用するには

import * as fs from 'node:fs';const fs = require('node:fs');

すべてのファイルシステム操作には、同期形式、コールバック形式、Promise ベースの形式があり、CommonJS 構文と ES6 モジュール (ESM) の両方を使用してアクセスできます。

Promise の例#

Promise ベースの操作は、非同期操作が完了したときに履行される Promise を返します。

import { unlink } from 'node:fs/promises';

try {
  await unlink('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (error) {
  console.error('there was an error:', error.message);
}const { unlink } = require('node:fs/promises');

(async function(path) {
  try {
    await unlink(path);
    console.log(`successfully deleted ${path}`);
  } catch (error) {
    console.error('there was an error:', error.message);
  }
})('/tmp/hello');

コールバックの例#

コールバック形式では、最後の引数として完了コールバック関数を受け取り、操作を非同期的に実行します。完了コールバックに渡される引数はメソッドによって異なりますが、最初の引数は常に例外用に予約されています。操作が正常に完了した場合、最初の引数はnullまたはundefinedになります。

import { unlink } from 'node:fs';

unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});const { unlink } = require('node:fs');

unlink('/tmp/hello', (err) => {
  if (err) throw err;
  console.log('successfully deleted /tmp/hello');
});

最大パフォーマンス(実行時間とメモリ割り当ての両面で)が要求される場合は、promise APIを使用するよりも、node:fsモジュールAPIのコールバックベースのバージョンを使用する方が望ましいです。

同期的な例#

同期APIは、操作が完了するまでNode.jsのイベントループとJavaScriptの実行をブロックします。例外はすぐにスローされ、try...catchを使用して処理するか、バブルアップさせることができます。

import { unlinkSync } from 'node:fs';

try {
  unlinkSync('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (err) {
  // handle the error
}const { unlinkSync } = require('node:fs');

try {
  unlinkSync('/tmp/hello');
  console.log('successfully deleted /tmp/hello');
} catch (err) {
  // handle the error
}

Promise API#

fs/promises APIは、promiseを返す非同期ファイルシステムメソッドを提供します。

promise APIは、基盤となるNode.jsのスレッドプールを使用して、イベントループスレッド外でファイルシステム操作を実行します。これらの操作は同期化されておらず、スレッドセーフではありません。同じファイルに対して複数の同時変更を実行する場合は注意が必要で、データ破損が発生する可能性があります。

クラス: FileHandle#

<FileHandle>オブジェクトは、数値ファイル記述子のオブジェクトラッパーです。

<FileHandle>オブジェクトのインスタンスは、fsPromises.open()メソッドによって作成されます。

すべての<FileHandle>オブジェクトは、<EventEmitter>です。

<FileHandle>filehandle.close()メソッドを使用して閉じられない場合、メモリリークを防ぐために、ファイル記述子を自動的に閉じようとし、プロセス警告を発します。これは信頼できない動作であり、ファイルが閉じられない可能性があるため、この動作に依存しないでください。代わりに、常に明示的に<FileHandle>を閉じてください。Node.jsは将来この動作を変更する可能性があります。

イベント: 'close'#

<FileHandle>が閉じられ、使用できなくなったときに、'close'イベントが発行されます。

filehandle.appendFile(data[, options])#

filehandle.writeFile()のエイリアスです。

ファイルハンドルを操作する場合、モードはfsPromises.open()で設定されたものから変更できません。したがって、これはfilehandle.writeFile()と同等です。

filehandle.chmod(mode)#
  • mode <integer> ファイルモードのビットマスク。
  • 戻り値: <Promise> 成功時にundefinedで解決します。

ファイルの権限を変更します。chmod(2)を参照してください。

filehandle.chown(uid, gid)#
  • uid <integer> ファイルの新しい所有者のユーザーID。
  • gid <integer> ファイルの新しいグループのグループID。
  • 戻り値: <Promise> 成功時にundefinedで解決します。

ファイルの所有権を変更します。chown(2)のラッパーです。

filehandle.close()#
  • 戻り値: <Promise> 成功時にundefinedで解決します。

ハンドルに対する保留中の操作が完了するのを待ってから、ファイルハンドルを閉じます。

import { open } from 'node:fs/promises';

let filehandle;
try {
  filehandle = await open('thefile.txt', 'r');
} finally {
  await filehandle?.close();
} 
filehandle.createReadStream([options])#

<stream.Readable>のデフォルトのhighWaterMarkである16KiBとは異なり、このメソッドによって返されるストリームのデフォルトのhighWaterMarkは64KiBです。

optionsには、ファイル全体ではなく、ファイルから一定の範囲のバイトを読み取るためのstartendの値を含めることができます。startendの両方は包括的で、0から数え始め、許容される値は[0, Number.MAX_SAFE_INTEGER]の範囲です。startが省略されているか、undefinedの場合、filehandle.createReadStream()は現在のファイル位置から順番に読み取ります。encodingは、<Buffer>で受け入れられるもののいずれかになります。

FileHandleが、キーボードやサウンドカードのように、ブロッキング読み取りのみをサポートする文字デバイスを指している場合、データが利用可能になるまで読み取り操作は完了しません。これにより、プロセスの終了やストリームの自然な終了が妨げられる可能性があります。

デフォルトでは、ストリームは破棄された後に'close'イベントを発行します。この動作を変更するには、emitCloseオプションをfalseに設定します。

import { open } from 'node:fs/promises';

const fd = await open('/dev/input/event0');
// Create a stream from some character device.
const stream = fd.createReadStream();
setTimeout(() => {
  stream.close(); // This may not close the stream.
  // Artificially marking end-of-stream, as if the underlying resource had
  // indicated end-of-file by itself, allows the stream to close.
  // This does not cancel pending read operations, and if there is such an
  // operation, the process may still not be able to exit successfully
  // until it finishes.
  stream.push(null);
  stream.read(0);
}, 100); 

autoCloseがfalseの場合、エラーが発生した場合でもファイル記述子は閉じられません。それを閉じ、ファイル記述子のリークがないことを確認するのはアプリケーションの責任です。autoCloseがtrue(デフォルトの動作)に設定されている場合、'error'または'end'でファイル記述子が自動的に閉じられます。

100バイトのファイルの最後の10バイトを読み取る例

import { open } from 'node:fs/promises';

const fd = await open('sample.txt');
fd.createReadStream({ start: 90, end: 99 }); 
filehandle.createWriteStream([options])#
  • options <Object>
    • encoding <string> デフォルト: 'utf8'
    • autoClose <boolean> デフォルト: true
    • emitClose <boolean> デフォルト: true
    • start <integer>
    • highWaterMark <number> デフォルト: 16384
    • flush <boolean> trueの場合、基盤となるファイル記述子が閉じられる前にフラッシュされます。デフォルト: false
  • 戻り値: <fs.WriteStream>

optionsには、ファイルの先頭を過ぎた位置にデータを書き込むためのstartオプションを含めることもできます。許容される値は[0, Number.MAX_SAFE_INTEGER]の範囲です。ファイルを置き換えるのではなく変更するには、デフォルトのrではなくflags openオプションをr+に設定する必要があります。encodingは、<Buffer>で受け入れられるもののいずれかになります。

autoCloseがtrue(デフォルトの動作)に設定されている場合、'error'または'finish'でファイル記述子が自動的に閉じられます。autoCloseがfalseの場合、エラーが発生した場合でもファイル記述子は閉じられません。それを閉じ、ファイル記述子のリークがないことを確認するのはアプリケーションの責任です。

デフォルトでは、ストリームは破棄された後に'close'イベントを発行します。この動作を変更するには、emitCloseオプションをfalseに設定します。

filehandle.datasync()#
  • 戻り値: <Promise> 成功時にundefinedで解決します。

ファイルに関連付けられている現在キューに入れられているすべてのI/O操作を、オペレーティングシステムの同期I/O完了状態に強制します。詳細については、POSIX fdatasync(2)ドキュメントを参照してください。

filehandle.syncとは異なり、このメソッドは変更されたメタデータをフラッシュしません。

filehandle.fd#
filehandle.read(buffer, offset, length, position)#
  • buffer <Buffer> | <TypedArray> | <DataView> 読み取られたファイルデータが入力されるバッファ。
  • offset <integer> 入力を開始するバッファ内の位置。デフォルト: 0
  • length <integer> 読み取るバイト数。デフォルト: buffer.byteLength - offset
  • position <integer> | <bigint> | <null> ファイルからデータの読み込みを開始する位置。null または -1 の場合、現在のファイル位置からデータが読み込まれ、位置が更新されます。position が非負の整数の場合、現在のファイル位置は変更されません。デフォルト: null
  • 戻り値: <Promise> 成功時に2つのプロパティを持つオブジェクトで解決されます。

ファイルからデータを読み込み、指定されたバッファーに格納します。

ファイルが同時に変更されない場合、読み込まれたバイト数がゼロになったときにファイルの終わりに到達します。

filehandle.read([options])#
  • options <Object>
    • buffer <Buffer> | <TypedArray> | <DataView> 読み込まれたファイルデータで埋められるバッファー。デフォルト: Buffer.alloc(16384)
    • offset <integer> 入力を開始するバッファ内の位置。デフォルト: 0
    • length <integer> 読み取るバイト数。デフォルト: buffer.byteLength - offset
    • position <integer> | <bigint> | <null> ファイルからデータの読み込みを開始する位置。null または -1 の場合、現在のファイル位置からデータが読み込まれ、位置が更新されます。position が非負の整数の場合、現在のファイル位置は変更されません。デフォルト: null
  • 戻り値: <Promise> 成功時に2つのプロパティを持つオブジェクトで解決されます。

ファイルからデータを読み込み、指定されたバッファーに格納します。

ファイルが同時に変更されない場合、読み込まれたバイト数がゼロになったときにファイルの終わりに到達します。

filehandle.read(buffer[, options])#
  • buffer <Buffer> | <TypedArray> | <DataView> 読み取られたファイルデータが入力されるバッファ。
  • options <Object>
    • offset <integer> 入力を開始するバッファ内の位置。デフォルト: 0
    • length <integer> 読み取るバイト数。デフォルト: buffer.byteLength - offset
    • position <integer> | <bigint> | <null> ファイルからデータの読み込みを開始する位置。null または -1 の場合、現在のファイル位置からデータが読み込まれ、位置が更新されます。position が非負の整数の場合、現在のファイル位置は変更されません。デフォルト: null
  • 戻り値: <Promise> 成功時に2つのプロパティを持つオブジェクトで解決されます。

ファイルからデータを読み込み、指定されたバッファーに格納します。

ファイルが同時に変更されない場合、読み込まれたバイト数がゼロになったときにファイルの終わりに到達します。

filehandle.readableWebStream([options])#

安定度: 1 - 試験的

ファイルのデータを読み込むために使用できる ReadableStream を返します。

このメソッドが複数回呼び出された場合、または FileHandle が閉じられた後または閉じている途中で呼び出された場合は、エラーがスローされます。

import {
  open,
} from 'node:fs/promises';

const file = await open('./some/file/to/read');

for await (const chunk of file.readableWebStream())
  console.log(chunk);

await file.close();const {
  open,
} = require('node:fs/promises');

(async () => {
  const file = await open('./some/file/to/read');

  for await (const chunk of file.readableWebStream())
    console.log(chunk);

  await file.close();
})();

ReadableStream はファイルを最後まで読み込みますが、FileHandle を自動的に閉じません。ユーザーコードは、引き続き fileHandle.close() メソッドを呼び出す必要があります。

filehandle.readFile(options)#
  • options <Object> | <string>
  • 戻り値: <Promise> ファイルの内容で正常に読み込みが完了すると解決されます。エンコーディングが指定されていない場合(options.encodingを使用)、データは <Buffer> オブジェクトとして返されます。それ以外の場合、データは文字列になります。

ファイルの全内容を非同期的に読み込みます。

options が文字列の場合、それは encoding を指定します。

<FileHandle> は読み取りをサポートしている必要があります。

1つ以上の filehandle.read() 呼び出しがファイルハンドルに対して行われ、その後 filehandle.readFile() 呼び出しが行われた場合、データは現在の位置からファイルの終わりまで読み込まれます。必ずしもファイルの先頭から読み込まれるわけではありません。

filehandle.readLines([options])#

readline インターフェースを作成し、ファイル全体をストリーム配信するための便利なメソッドです。オプションについては、filehandle.createReadStream() を参照してください。

import { open } from 'node:fs/promises';

const file = await open('./some/file/to/read');

for await (const line of file.readLines()) {
  console.log(line);
}const { open } = require('node:fs/promises');

(async () => {
  const file = await open('./some/file/to/read');

  for await (const line of file.readLines()) {
    console.log(line);
  }
})();
filehandle.readv(buffers[, position])#
  • buffers <Buffer[]> | <TypedArray[]> | <DataView[]>
  • position <integer> | <null> データの読み取りを開始するファイルの先頭からのオフセット。positionnumber でない場合、データは現在の位置から読み込まれます。デフォルト: null
  • 戻り値: <Promise> 成功時に、2つのプロパティを含むオブジェクトで解決されます。

ファイルから読み取り、<ArrayBufferView> の配列に書き込みます。

filehandle.stat([options])#
filehandle.sync()#
  • 戻り値: <Promise> 成功時にundefinedで解決します。

開いているファイル記述子のすべてのデータがストレージデバイスにフラッシュされるように要求します。具体的な実装は、オペレーティングシステムとデバイスに固有です。詳細については、POSIX fsync(2) ドキュメントを参照してください。

filehandle.truncate(len)#
  • len <integer> デフォルト: 0
  • 戻り値: <Promise> 成功時にundefinedで解決します。

ファイルを切り捨てます。

ファイルが len バイトより大きい場合、ファイルの最初の len バイトのみが保持されます。

次の例では、ファイルの最初の4バイトのみを保持します。

import { open } from 'node:fs/promises';

let filehandle = null;
try {
  filehandle = await open('temp.txt', 'r+');
  await filehandle.truncate(4);
} finally {
  await filehandle?.close();
} 

ファイルが以前に len バイトより短かった場合は拡張され、拡張された部分はヌルバイト ('\0') で埋められます。

len が負の場合、0 が使用されます。

filehandle.utimes(atime, mtime)#

<FileHandle> で参照されるオブジェクトのファイルシステムのタイムスタンプを変更し、成功時に引数なしで Promise を解決します。

filehandle.write(buffer, offset[, length[, position]])#
  • buffer <Buffer> | <TypedArray> | <DataView>
  • offset <integer> 書き込むデータの開始位置が buffer 内のどこか。
  • length <integer> buffer から書き込むバイト数。デフォルト: buffer.byteLength - offset
  • position <integer> | <null> buffer からのデータを書き込むファイルの先頭からのオフセット。positionnumber でない場合、データは現在の位置に書き込まれます。詳細については、POSIX pwrite(2) ドキュメントを参照してください。デフォルト: null
  • 戻り値: <Promise>

buffer をファイルに書き込みます。

Promise は、2つのプロパティを含むオブジェクトで解決されます。

Promise が解決 (または拒否) されるのを待たずに、同じファイルで filehandle.write() を複数回使用するのは安全ではありません。このシナリオでは、filehandle.createWriteStream() を使用してください。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの最後にデータを追加します。

filehandle.write(buffer[, options])#

buffer をファイルに書き込みます。

上記の filehandle.write 関数と同様に、このバージョンではオプションの options オブジェクトを受け取ります。options オブジェクトが指定されていない場合、上記の値がデフォルトになります。

filehandle.write(string[, position[, encoding]])#
  • string <string>
  • position <整数> | <null> string からのデータを書き込むファイルの先頭からのオフセットです。positionnumber でない場合、データは現在の位置に書き込まれます。詳細については、POSIX の pwrite(2) ドキュメントを参照してください。デフォルト: null
  • encoding <文字列> 予期される文字列エンコーディングです。デフォルト: 'utf8'
  • 戻り値: <Promise>

string をファイルに書き込みます。string が文字列でない場合、Promise はエラーでリジェクトされます。

Promise は、2つのプロパティを含むオブジェクトで解決されます。

  • bytesWritten <integer> 書き込まれたバイト数
  • buffer <文字列> 書き込まれた string への参照です。

Promise が解決 (または拒否) されるのを待たずに、同じファイルで filehandle.write() を複数回使用するのは安全ではありません。このシナリオでは、filehandle.createWriteStream() を使用してください。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの最後にデータを追加します。

filehandle.writeFile(data, options)#

非同期的にデータをファイルに書き込みます。ファイルが既に存在する場合は上書きします。data は、文字列、バッファー、<AsyncIterable>、または <Iterable> オブジェクトにすることができます。Promise は成功時に引数なしで解決されます。

options が文字列の場合、それは encoding を指定します。

<FileHandle> は書き込みをサポートする必要があります。

Promise が解決 (またはリジェクト) されるのを待たずに、同じファイルに対して filehandle.writeFile() を複数回使用するのは安全ではありません。

ファイルハンドルに対して 1 回以上の filehandle.write() 呼び出しが行われた後で filehandle.writeFile() 呼び出しが行われた場合、データは現在の位置からファイルの最後まで書き込まれます。必ずしもファイルの先頭から書き込まれるとは限りません。

filehandle.writev(buffers[, position])#
  • buffers <Buffer[]> | <TypedArray[]> | <DataView[]>
  • position <整数> | <null> buffers からのデータを書き込むファイルの先頭からのオフセットです。positionnumber でない場合、データは現在の位置に書き込まれます。デフォルト: null
  • 戻り値: <Promise>

<ArrayBufferView> の配列をファイルに書き込みます。

Promise は、2 つのプロパティを含むオブジェクトで解決されます。

Promise が解決 (またはリジェクト) されるのを待たずに、同じファイルに対して writev() を複数回呼び出すのは安全ではありません。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの末尾に追加します。

filehandle[Symbol.asyncDispose]()#

安定度: 1 - 試験的

filehandle.close() のエイリアスです。

fsPromises.access(path[, mode])#

path で指定されたファイルまたはディレクトリに対するユーザーのアクセス許可をテストします。mode 引数は、実行するアクセス可能性チェックを指定するオプションの整数です。mode は、fs.constants.F_OK の値または、fs.constants.R_OKfs.constants.W_OK、および fs.constants.X_OK のいずれかのビット単位の OR で構成されるマスクのいずれかである必要があります (例: fs.constants.W_OK | fs.constants.R_OK)。mode の可能な値については、ファイルアクセス定数を確認してください。

アクセス可能性チェックが成功した場合、Promise は値なしで解決されます。アクセス可能性チェックのいずれかが失敗した場合、Promise は <エラー> オブジェクトでリジェクトされます。次の例では、ファイル /etc/passwd を現在のプロセスで読み取りおよび書き込みできるかどうかを確認します。

import { access, constants } from 'node:fs/promises';

try {
  await access('/etc/passwd', constants.R_OK | constants.W_OK);
  console.log('can access');
} catch {
  console.error('cannot access');
} 

fsPromises.open() を呼び出す前にファイルのアクセス可能性を確認するために fsPromises.access() を使用することはお勧めしません。そうすると、他のプロセスが 2 回の呼び出しの間でファイルの状態を変更する可能性があるため、競合状態が発生します。代わりに、ユーザーコードはファイルを直接開く/読み取り/書き込みし、ファイルにアクセスできない場合に発生するエラーを処理する必要があります。

fsPromises.appendFile(path, data[, options])#

非同期的にデータをファイルに追加し、ファイルが存在しない場合は作成します。data は、文字列または <Buffer> にすることができます。

options が文字列の場合、それは encoding を指定します。

mode オプションは、新しく作成されたファイルにのみ影響します。詳細については、fs.open() を参照してください。

path は、追加用に開かれた (fsPromises.open() を使用) <FileHandle> として指定できます。

fsPromises.chmod(path, mode)#

ファイルの権限を変更します。

fsPromises.chown(path, uid, gid)#

ファイルの所有権を変更します。

fsPromises.copyFile(src, dest[, mode])#

  • src <文字列> | <Buffer> | <URL> コピー元のファイル名
  • dest <文字列> | <Buffer> | <URL> コピー操作のコピー先のファイル名
  • mode <整数> コピー操作の動作を指定するオプションの修飾子。2 つ以上の値のビット単位の OR で構成されるマスクを作成できます (例: fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE)。デフォルト: 0
    • fs.constants.COPYFILE_EXCL: dest が既に存在する場合、コピー操作は失敗します。
    • fs.constants.COPYFILE_FICLONE: コピー操作は、コピーオンライトの reflink を作成しようとします。プラットフォームがコピーオンライトをサポートしていない場合は、フォールバックコピーメカニズムが使用されます。
    • fs.constants.COPYFILE_FICLONE_FORCE: コピー操作は、コピーオンライトの reflink を作成しようとします。プラットフォームがコピーオンライトをサポートしていない場合、操作は失敗します。
  • 戻り値: <Promise> 成功時にundefinedで解決します。

非同期的に srcdest にコピーします。デフォルトでは、dest が既に存在する場合は上書きされます。

コピー操作のアトミシティについては保証されていません。コピー先のファイルが書き込みのために開かれた後でエラーが発生した場合は、コピー先の削除が試行されます。

import { copyFile, constants } from 'node:fs/promises';

try {
  await copyFile('source.txt', 'destination.txt');
  console.log('source.txt was copied to destination.txt');
} catch {
  console.error('The file could not be copied');
}

// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
try {
  await copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL);
  console.log('source.txt was copied to destination.txt');
} catch {
  console.error('The file could not be copied');
} 

fsPromises.cp(src, dest[, options])#

安定度: 1 - 試験的

  • src <文字列> | <URL> コピー元のパス。
  • dest <文字列> | <URL> コピー先のパス。
  • options <Object>
    • dereference <真偽値> シンボリックリンクを非参照化します。デフォルト: false
    • errorOnExist <真偽値> forcefalse で、コピー先が存在する場合、エラーをスローします。デフォルト: false
    • filter <関数> コピーされたファイル/ディレクトリをフィルタリングする関数。項目をコピーする場合は true を返し、無視する場合は false を返します。ディレクトリを無視すると、そのすべての内容もスキップされます。true または false に解決される Promise を返すこともできます。デフォルト: undefined
    • force <真偽値> 既存のファイルまたはディレクトリを上書きします。この値を false に設定し、コピー先が存在する場合、コピー操作はエラーを無視します。この動作を変更するには、errorOnExist オプションを使用します。デフォルト: true
    • mode <整数> コピー操作の修飾子。デフォルト: 0fsPromises.copyFile()mode フラグを参照してください。
    • preserveTimestamps <真偽値> true の場合、src からのタイムスタンプが保持されます。デフォルト: false
    • recursive <boolean> ディレクトリを再帰的にコピーします。デフォルト: false
    • verbatimSymlinks <boolean> true の場合、シンボリックリンクのパス解決をスキップします。デフォルト: false
  • 戻り値: <Promise> 成功時にundefinedで解決します。

src から dest へ、サブディレクトリやファイルを含むディレクトリ構造全体を非同期にコピーします。

あるディレクトリを別のディレクトリへコピーする場合、glob はサポートされず、cp dir1/ dir2/ と同様の動作になります。

fsPromises.lchmod(path, mode)#

シンボリックリンクのパーミッションを変更します。

このメソッドは macOS でのみ実装されています。

fsPromises.lchown(path, uid, gid)#

シンボリックリンクの所有権を変更します。

fsPromises.lutimes(path, atime, mtime)#

fsPromises.utimes() と同様にファイルのアクセス時間と変更時間を変更しますが、パスがシンボリックリンクを参照する場合、リンクは間接参照されません。代わりに、シンボリックリンク自体のタイムスタンプが変更されます。

fsPromises.link(existingPath, newPath)#

existingPath から newPath への新しいリンクを作成します。詳細については、POSIX の link(2) ドキュメントを参照してください。

fsPromises.lstat(path[, options])#

path がシンボリックリンクを参照する場合を除き、fsPromises.stat() と同等です。その場合、参照先のファイルではなくリンク自体が stat されます。詳細については、POSIX の lstat(2) ドキュメントを参照してください。

fsPromises.mkdir(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object> | <integer>
    • recursive <boolean> デフォルト: false
    • mode <string> | <integer> Windows ではサポートされていません。デフォルト: 0o777
  • 戻り値: <Promise> 成功した場合、recursivefalse の場合は undefined で解決され、recursivetrue の場合は最初に作成されたディレクトリパスで解決されます。

非同期的にディレクトリを作成します。

オプションの options 引数には、mode (パーミッションとスティッキービット) を指定する整数、または親ディレクトリを作成するかどうかを示す mode プロパティと recursive プロパティを持つオブジェクトを指定できます。path が存在するディレクトリであるときに fsPromises.mkdir() を呼び出すと、recursive が false の場合にのみ拒否されます。

import { mkdir } from 'node:fs/promises';

try {
  const projectFolder = new URL('./test/project/', import.meta.url);
  const createDir = await mkdir(projectFolder, { recursive: true });

  console.log(`created ${createDir}`);
} catch (err) {
  console.error(err.message);
}const { mkdir } = require('node:fs/promises');
const { join } = require('node:path');

async function makeDirectory() {
  const projectFolder = join(__dirname, 'test', 'project');
  const dirCreation = await mkdir(projectFolder, { recursive: true });

  console.log(dirCreation);
  return dirCreation;
}

makeDirectory().catch(console.error);

fsPromises.mkdtemp(prefix[, options])#

一意の一時ディレクトリを作成します。一意のディレクトリ名は、指定された prefix の末尾に 6 つのランダムな文字を追加することで生成されます。プラットフォームの不整合のため、prefix の末尾に X 文字を使用しないでください。一部のプラットフォーム (特に BSD) では、6 つ以上のランダムな文字を返し、prefix の末尾の X 文字をランダムな文字に置き換えることができます。

オプションの options 引数には、エンコーディングを指定する文字列、または使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。

import { mkdtemp } from 'node:fs/promises';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

try {
  await mkdtemp(join(tmpdir(), 'foo-'));
} catch (err) {
  console.error(err);
} 

fsPromises.mkdtemp() メソッドは、6 つのランダムに選択された文字を prefix 文字列に直接追加します。たとえば、ディレクトリ /tmp がある場合、/tmp *内* に一時ディレクトリを作成するつもりである場合、prefix は末尾にプラットフォーム固有のパス区切り文字 (require('node:path').sep) を付ける必要があります。

fsPromises.open(path, flags[, mode])#

<FileHandle> を開きます。

詳細については、POSIX の open(2) ドキュメントを参照してください。

一部の文字 (< > : " / \ | ? *) は、ファイル、パス、名前空間の命名 に記載されているように、Windows で予約されています。NTFS では、ファイル名にコロンが含まれている場合、Node.js は この MSDN ページ に記載されているように、ファイルシステムストリームを開きます。

fsPromises.opendir(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • encoding <string> | <null> デフォルト: 'utf8'
    • bufferSize <number> ディレクトリから読み取るときに内部的にバッファリングされるディレクトリエントリの数。値を大きくするとパフォーマンスは向上しますが、メモリ使用量も増加します。デフォルト: 32
    • recursive <boolean> 解決された Dir は、すべてのサブファイルとディレクトリを含む <AsyncIterable> になります。デフォルト: false
  • 戻り値: <Promise> <fs.Dir> で解決されます。

反復スキャン用にディレクトリを非同期に開きます。詳細については、POSIX の opendir(3) ドキュメントを参照してください。

<fs.Dir> を作成します。これには、ディレクトリからの読み取りとクリーンアップのすべての追加機能が含まれています。

encoding オプションは、ディレクトリを開く際と、後続の読み取り操作時の path のエンコーディングを設定します。

非同期イテレーションを使用する例

import { opendir } from 'node:fs/promises';

try {
  const dir = await opendir('./');
  for await (const dirent of dir)
    console.log(dirent.name);
} catch (err) {
  console.error(err);
} 

非同期イテレータを使用する場合、イテレータが終了した後、<fs.Dir> オブジェクトは自動的に閉じられます。

fsPromises.readdir(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <string> | <Object>
    • encoding <string> デフォルト: 'utf8'
    • withFileTypes <boolean> デフォルト: false
    • recursive <boolean> true の場合、ディレクトリの内容を再帰的に読み取ります。再帰モードでは、すべてのファイル、サブファイル、およびディレクトリがリストされます。デフォルト: false
  • 戻り値: <Promise> ディレクトリ内のファイルの名前の配列('.' および '..' を除く)で解決されます。

ディレクトリの内容を読み取ります。

オプションの options 引数には、エンコーディングを指定する文字列、またはファイル名に使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるファイル名は <Buffer> オブジェクトとして渡されます。

options.withFileTypestrue に設定されている場合、返される配列には <fs.Dirent> オブジェクトが含まれます。

import { readdir } from 'node:fs/promises';

try {
  const files = await readdir(path);
  for (const file of files)
    console.log(file);
} catch (err) {
  console.error(err);
} 

fsPromises.readFile(path[, options])#

ファイルの全内容を非同期的に読み込みます。

エンコーディングが指定されていない場合 (options.encoding を使用)、データは <Buffer> オブジェクトとして返されます。それ以外の場合、データは文字列になります。

options が文字列の場合、それはエンコーディングを指定します。

path がディレクトリの場合、fsPromises.readFile() の動作はプラットフォームに依存します。macOS、Linux、および Windows では、Promise はエラーで拒否されます。FreeBSD では、ディレクトリの内容の表現が返されます。

実行中のコードと同じディレクトリにある package.json ファイルを読み込む例

import { readFile } from 'node:fs/promises';
try {
  const filePath = new URL('./package.json', import.meta.url);
  const contents = await readFile(filePath, { encoding: 'utf8' });
  console.log(contents);
} catch (err) {
  console.error(err.message);
}const { readFile } = require('node:fs/promises');
const { resolve } = require('node:path');
async function logFile() {
  try {
    const filePath = resolve('./package.json');
    const contents = await readFile(filePath, { encoding: 'utf8' });
    console.log(contents);
  } catch (err) {
    console.error(err.message);
  }
}
logFile();

<AbortSignal> を使用して、進行中の readFile を中止することができます。リクエストが中止された場合、返される Promise は AbortError で拒否されます。

import { readFile } from 'node:fs/promises';

try {
  const controller = new AbortController();
  const { signal } = controller;
  const promise = readFile(fileName, { signal });

  // Abort the request before the promise settles.
  controller.abort();

  await promise;
} catch (err) {
  // When a request is aborted - err is an AbortError
  console.error(err);
} 

進行中のリクエストを中止しても、個々のオペレーティングシステムのリクエストが中止されるのではなく、内部バッファリングである fs.readFile の実行が中止されます。

指定された <FileHandle> は、読み取りをサポートしている必要があります。

fsPromises.readlink(path[, options])#

path で参照されるシンボリックリンクの内容を読み取ります。詳細については、POSIX の readlink(2) ドキュメントを参照してください。Promise は、成功時に linkString で解決します。

オプションの options 引数には、エンコーディングを指定する文字列、または、返されるリンクパスに使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるリンクパスは <Buffer> オブジェクトとして渡されます。

fsPromises.realpath(path[, options])#

fs.realpath.native() 関数と同じセマンティクスを使用して、path の実際の場所を決定します。

UTF8 文字列に変換できるパスのみがサポートされています。

オプションの options 引数には、エンコーディングを指定する文字列、または、パスに使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるパスは <Buffer> オブジェクトとして渡されます。

Linux では、Node.js が musl libc にリンクされている場合、この関数が動作するためには、procfs ファイルシステムが /proc にマウントされている必要があります。Glibc にはこの制限はありません。

fsPromises.rename(oldPath, newPath)#

oldPathnewPath に名前変更します。

fsPromises.rmdir(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • maxRetries <integer> EBUSYEMFILEENFILEENOTEMPTY、または EPERM エラーが発生した場合、Node.js は、試行ごとに retryDelay ミリ秒ずつ長く線形バックオフ待機で操作を再試行します。このオプションは、再試行の回数を表します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 0
    • recursive <boolean> true の場合、再帰的なディレクトリ削除を実行します。再帰モードでは、操作は失敗時に再試行されます。デフォルト: false非推奨。
    • retryDelay <integer> 再試行の間隔をミリ秒単位で指定します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 100
  • 戻り値: <Promise> 成功時にundefinedで解決します。

path で識別されるディレクトリを削除します。

ファイル (ディレクトリではない) に対して fsPromises.rmdir() を使用すると、Windows では ENOENT エラー、POSIX では ENOTDIR エラーが発生して Promise が拒否されます。

rm -rf Unix コマンドと同様の動作を実現するには、{ recursive: true, force: true } オプションを指定して fsPromises.rm() を使用します。

fsPromises.rm(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • force <boolean> true の場合、path が存在しない場合は例外が無視されます。デフォルト: false
    • maxRetries <integer> EBUSYEMFILEENFILEENOTEMPTY、または EPERM エラーが発生した場合、Node.js は、試行ごとに retryDelay ミリ秒ずつ長く線形バックオフ待機で操作を再試行します。このオプションは、再試行の回数を表します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 0
    • recursive <boolean> true の場合、再帰的なディレクトリ削除を実行します。再帰モードでは、操作は失敗時に再試行されます。デフォルト: false
    • retryDelay <integer> 再試行の間隔をミリ秒単位で指定します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 100
  • 戻り値: <Promise> 成功時にundefinedで解決します。

ファイルとディレクトリを削除します (標準 POSIX rm ユーティリティをモデルにしています)。

fsPromises.stat(path[, options])#

fsPromises.statfs(path[, options])#

fsPromises.symlink(target, path[, type])#

シンボリックリンクを作成します。

type 引数は、Windows プラットフォームでのみ使用され、'dir''file'、または 'junction' のいずれかになります。type 引数が文字列でない場合、Node.js は target のタイプを自動検出し、'file' または 'dir' を使用します。target が存在しない場合は、'file' が使用されます。Windows のジャンクションポイントには、絶対パスの宛先パスが必要です。'junction' を使用する場合、target 引数は自動的に絶対パスに正規化されます。NTFS ボリュームのジャンクションポイントは、ディレクトリのみを指すことができます。

fsPromises.truncate(path[, len])#

path のコンテンツを len バイトに切り詰めます (短縮または延長)。

fsPromises.unlink(path)#

path がシンボリックリンクを参照している場合、リンクが参照しているファイルまたはディレクトリに影響を与えることなくリンクが削除されます。path がシンボリックリンクではないファイルパスを参照している場合、ファイルは削除されます。詳細については、POSIX の unlink(2) ドキュメントを参照してください。

fsPromises.utimes(path, atime, mtime)#

path で参照されるオブジェクトのファイルシステムタイムスタンプを変更します。

atime および mtime 引数は、次のルールに従います。

  • 値には、Unix エポック時間を表す数値、Date、または '123456789.0' のような数値文字列を使用できます。
  • 値を数値に変換できない場合、または NaNInfinity、または -Infinity の場合は、Error がスローされます。

fsPromises.watch(filename[, options])#

  • filename <string> | <Buffer> | <URL>
  • options <string> | <Object>
    • persistent <boolean> ファイルが監視されている間、プロセスを実行し続けるかどうかを示します。デフォルト: true
    • recursive <boolean> すべてのサブディレクトリを監視するか、現在のディレクトリのみを監視するかを示します。これは、ディレクトリが指定されている場合に適用され、サポートされているプラットフォームでのみ適用されます(注意点を参照)。デフォルト: false
    • encoding <string> リスナーに渡されるファイル名に使用する文字エンコーディングを指定します。デフォルト: 'utf8'
    • signal <AbortSignal> ウォッチャーを停止するタイミングを通知するために使用される<AbortSignal>
  • 戻り値: プロパティを持つオブジェクトの<AsyncIterator>

filename(ファイルまたはディレクトリ)の変更を監視する非同期イテレータを返します。

const { watch } = require('node:fs/promises');

const ac = new AbortController();
const { signal } = ac;
setTimeout(() => ac.abort(), 10000);

(async () => {
  try {
    const watcher = watch(__filename, { signal });
    for await (const event of watcher)
      console.log(event);
  } catch (err) {
    if (err.name === 'AbortError')
      return;
    throw err;
  }
})(); 

ほとんどのプラットフォームでは、ディレクトリ内でファイル名が表示または非表示になるたびに、'rename'が発行されます。

fs.watch()注意点はすべてfsPromises.watch()にも適用されます。

fsPromises.writeFile(file, data[, options])#

非同期的にデータをファイルに書き込み、ファイルが存在する場合は置き換えます。dataには、文字列、バッファー、<AsyncIterable>、または<Iterable>オブジェクトを指定できます。

dataがバッファーの場合、encodingオプションは無視されます。

options が文字列の場合、それはエンコーディングを指定します。

mode オプションは、新しく作成されたファイルにのみ影響します。詳細については、fs.open() を参照してください。

指定された<FileHandle>は、書き込みをサポートしている必要があります。

プロミスが解決されるのを待たずに、同じファイルに対してfsPromises.writeFile()を複数回使用することは安全ではありません。

fsPromises.readFileと同様に、fsPromises.writeFileは、渡されたバッファーを書き込むために内部で複数のwrite呼び出しを実行する便利なメソッドです。パフォーマンスが重要なコードの場合は、fs.createWriteStream()またはfilehandle.createWriteStream()の使用を検討してください。

<AbortSignal>を使用してfsPromises.writeFile()をキャンセルできます。キャンセルは「ベストエフォート」であり、ある程度のデータは書き込まれる可能性があります。

import { writeFile } from 'node:fs/promises';
import { Buffer } from 'node:buffer';

try {
  const controller = new AbortController();
  const { signal } = controller;
  const data = new Uint8Array(Buffer.from('Hello Node.js'));
  const promise = writeFile('message.txt', data, { signal });

  // Abort the request before the promise settles.
  controller.abort();

  await promise;
} catch (err) {
  // When a request is aborted - err is an AbortError
  console.error(err);
} 

進行中のリクエストを中止しても、個々のオペレーティングシステムのリクエストは中止されず、fs.writeFileが実行する内部バッファリングが中止されます。

fsPromises.constants#

ファイルシステム操作で一般的に使用される定数を含むオブジェクトを返します。オブジェクトはfs.constantsと同じです。詳細については、FS定数を参照してください。

コールバックAPI#

コールバックAPIは、イベントループをブロックせずにすべて非同期的に操作を実行し、完了またはエラー時にコールバック関数を呼び出します。

コールバックAPIは、基盤となるNode.jsスレッドプールを使用して、イベントループスレッドから離れた場所でファイルシステム操作を実行します。これらの操作は同期されておらず、スレッドセーフではありません。同じファイルに対して複数の同時変更を実行する場合は、データが破損する可能性があるため、注意が必要です。

fs.access(path[, mode], callback)#

path で指定されたファイルまたはディレクトリに対するユーザーのアクセス許可をテストします。mode 引数は、実行するアクセス可能性チェックを指定するオプションの整数です。mode は、fs.constants.F_OK の値または、fs.constants.R_OKfs.constants.W_OK、および fs.constants.X_OK のいずれかのビット単位の OR で構成されるマスクのいずれかである必要があります (例: fs.constants.W_OK | fs.constants.R_OK)。mode の可能な値については、ファイルアクセス定数を確認してください。

最後の引数callbackは、発生した可能性のあるエラー引数とともに呼び出されるコールバック関数です。アクセシビリティチェックのいずれかが失敗した場合、エラー引数はErrorオブジェクトになります。次の例では、package.jsonが存在するかどうか、および読み取り可能か書き込み可能かどうかをチェックします。

import { access, constants } from 'node:fs';

const file = 'package.json';

// Check if the file exists in the current directory.
access(file, constants.F_OK, (err) => {
  console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});

// Check if the file is readable.
access(file, constants.R_OK, (err) => {
  console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});

// Check if the file is writable.
access(file, constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});

// Check if the file is readable and writable.
access(file, constants.R_OK | constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
}); 

fs.access()を使用して、fs.open()fs.readFile()、またはfs.writeFile()を呼び出す前にファイルのアクセシビリティをチェックしないでください。そうすると、他のプロセスが2つの呼び出しの間にファイルの状態を変更する可能性があるため、競合状態が発生します。代わりに、ユーザーコードはファイルを直接開く/読み取り/書き込みし、ファイルにアクセスできない場合に発生するエラーを処理する必要があります。

書き込み(非推奨)

import { access, open, close } from 'node:fs';

access('myfile', (err) => {
  if (!err) {
    console.error('myfile already exists');
    return;
  }

  open('myfile', 'wx', (err, fd) => {
    if (err) throw err;

    try {
      writeMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
}); 

書き込み(推奨)

import { open, close } from 'node:fs';

open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
}); 

読み取り(非推奨)

import { access, open, close } from 'node:fs';
access('myfile', (err) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  open('myfile', 'r', (err, fd) => {
    if (err) throw err;

    try {
      readMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
}); 

読み取り(推奨)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
}); 

上記の「非推奨」の例では、アクセシビリティをチェックしてからファイルを使用しています。「推奨」の例の方が、ファイルを直接使用してエラー(ある場合)を処理するため、より適切です。

一般に、ファイルを使用しない場合、たとえば、そのアクセシビリティが別のプロセスからの信号である場合にのみ、ファイルのアクセシビリティをチェックしてください。

Windowsでは、ディレクトリのアクセス制御ポリシー(ACL)によって、ファイルまたはディレクトリへのアクセスが制限される場合があります。ただし、fs.access()関数はACLをチェックしないため、ACLによってユーザーが読み取りまたは書き込みを制限されている場合でも、パスにアクセス可能であると報告する場合があります。

fs.appendFile(path, data[, options], callback)#

非同期的にデータをファイルに追加し、ファイルが存在しない場合は作成します。data は、文字列または <Buffer> にすることができます。

mode オプションは、新しく作成されたファイルにのみ影響します。詳細については、fs.open() を参照してください。

import { appendFile } from 'node:fs';

appendFile('message.txt', 'data to append', (err) => {
  if (err) throw err;
  console.log('The "data to append" was appended to file!');
}); 

optionsが文字列の場合、エンコーディングを指定します。

import { appendFile } from 'node:fs';

appendFile('message.txt', 'data to append', 'utf8', callback); 

pathは、(fs.open()またはfs.openSync()を使用して)追加用に開かれている数値ファイルディスクリプターとして指定できます。ファイルディスクリプターは自動的に閉じられません。

import { open, close, appendFile } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('message.txt', 'a', (err, fd) => {
  if (err) throw err;

  try {
    appendFile(fd, 'data to append', 'utf8', (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
}); 

fs.chmod(path, mode, callback)#

ファイルの権限を非同期的に変更します。完了コールバックには、発生する可能性のある例外以外の引数は渡されません。

詳細については、POSIX chmod(2)のドキュメントを参照してください。

import { chmod } from 'node:fs';

chmod('my_file.txt', 0o775, (err) => {
  if (err) throw err;
  console.log('The permissions for file "my_file.txt" have been changed!');
}); 
ファイルモード#

fs.chmod()メソッドとfs.chmodSync()メソッドの両方で使用されるmode引数は、次の定数の論理ORを使用して作成された数値ビットマスクです。

定数8進数説明
fs.constants.S_IRUSR0o400所有者による読み取り
fs.constants.S_IWUSR0o200所有者による書き込み
fs.constants.S_IXUSR0o100所有者による実行/検索
fs.constants.S_IRGRP0o40グループによる読み取り
fs.constants.S_IWGRP0o20グループによる書き込み
fs.constants.S_IXGRP0o10グループによる実行/検索
fs.constants.S_IROTH0o4他のユーザーによる読み取り
fs.constants.S_IWOTH0o2他のユーザーによる書き込み
fs.constants.S_IXOTH0o1他のユーザーによる実行/検索

modeを構築する簡単な方法は、3つの8進数(例:765)のシーケンスを使用することです。左端の数字(例では7)は、ファイルの所有者の権限を指定します。中央の数字(例では6)は、グループの権限を指定します。右端の数字(例では5)は、他のユーザーの権限を指定します。

番号説明
7読み取り、書き込み、実行
6読み取りと書き込み
5読み取りと実行
4読み取り専用
3書き込みと実行
2書き込み専用
1実行専用
0権限なし

たとえば、8進数値0o765は次のことを意味します。

  • 所有者はファイルの読み取り、書き込み、および実行ができます。
  • グループはファイルの読み取りと書き込みができます。
  • 他のユーザーはファイルの読み取りと実行ができます。

ファイルモードが予期される場所で生の数値を使用する場合、0o777より大きい値を使用すると、一貫して機能するようにサポートされていないプラットフォーム固有の動作が発生する可能性があります。したがって、S_ISVTXS_ISGID、またはS_ISUIDのような定数はfs.constantsで公開されていません。

注意点: Windowsでは、書き込み権限のみを変更でき、グループ、所有者、または他のユーザーの権限の区別は実装されていません。

fs.chown(path, uid, gid, callback)#

ファイルの所有者とグループを非同期的に変更します。完了コールバックには、起こりうる例外以外の引数は渡されません。

詳細については、POSIX の chown(2) のドキュメントを参照してください。

fs.close(fd[, callback])#

ファイル記述子を閉じます。完了コールバックには、起こりうる例外以外の引数は渡されません。

他の fs 操作で現在使用中のファイル記述子 (fd) に対して fs.close() を呼び出すと、未定義の動作につながる可能性があります。

詳細については、POSIX の close(2) のドキュメントを参照してください。

fs.copyFile(src, dest[, mode], callback)#

src を非同期的に dest にコピーします。デフォルトでは、dest がすでに存在する場合は上書きされます。コールバック関数には、起こりうる例外以外の引数は渡されません。Node.js は、コピー操作のアトミシティについては保証しません。コピー先のファイルが書き込み用に開かれた後にエラーが発生した場合、Node.js はコピー先の削除を試みます。

mode は、コピー操作の動作を指定するオプションの整数です。2 つ以上の値のビット単位の OR で構成されるマスクを作成できます (例: fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE)。

  • fs.constants.COPYFILE_EXCL: dest が既に存在する場合、コピー操作は失敗します。
  • fs.constants.COPYFILE_FICLONE: コピー操作は、コピーオンライトの reflink を作成しようとします。プラットフォームがコピーオンライトをサポートしていない場合は、フォールバックコピーメカニズムが使用されます。
  • fs.constants.COPYFILE_FICLONE_FORCE: コピー操作は、コピーオンライトの reflink を作成しようとします。プラットフォームがコピーオンライトをサポートしていない場合、操作は失敗します。
import { copyFile, constants } from 'node:fs';

function callback(err) {
  if (err) throw err;
  console.log('source.txt was copied to destination.txt');
}

// destination.txt will be created or overwritten by default.
copyFile('source.txt', 'destination.txt', callback);

// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
copyFile('source.txt', 'destination.txt', constants.COPYFILE_EXCL, callback); 

fs.cp(src, dest[, options], callback)#

安定度: 1 - 試験的

  • src <文字列> | <URL> コピー元のパス。
  • dest <文字列> | <URL> コピー先のパス。
  • options <Object>
    • dereference <真偽値> シンボリックリンクを非参照化します。デフォルト: false
    • errorOnExist <真偽値> forcefalse で、コピー先が存在する場合、エラーをスローします。デフォルト: false
    • filter <関数> コピーされたファイル/ディレクトリをフィルタリングする関数。項目をコピーする場合は true を返し、無視する場合は false を返します。ディレクトリを無視すると、そのすべての内容もスキップされます。true または false に解決される Promise を返すこともできます。デフォルト: undefined
    • force <真偽値> 既存のファイルまたはディレクトリを上書きします。この値を false に設定し、コピー先が存在する場合、コピー操作はエラーを無視します。この動作を変更するには、errorOnExist オプションを使用します。デフォルト: true
    • mode <整数> コピー操作の修飾子。デフォルト: 0fs.copyFile()mode フラグを参照してください。
    • preserveTimestamps <真偽値> true の場合、src からのタイムスタンプが保持されます。デフォルト: false
    • recursive <boolean> ディレクトリを再帰的にコピーします。デフォルト: false
    • verbatimSymlinks <boolean> true の場合、シンボリックリンクのパス解決をスキップします。デフォルト: false
  • callback <Function>

src から dest へ、サブディレクトリやファイルを含むディレクトリ構造全体を非同期にコピーします。

あるディレクトリを別のディレクトリへコピーする場合、glob はサポートされず、cp dir1/ dir2/ と同様の動作になります。

fs.createReadStream(path[, options])#

<stream.Readable>のデフォルトのhighWaterMarkである16KiBとは異なり、このメソッドによって返されるストリームのデフォルトのhighWaterMarkは64KiBです。

options には、ファイル全体ではなく、ファイルのバイト範囲を読み取るための start および end の値を含めることができます。startend は両方とも包括的であり、0 から数え始め、許容値は [0, Number.MAX_SAFE_INTEGER] の範囲です。fd が指定され、start が省略または undefined の場合、fs.createReadStream() は現在のファイル位置から順次読み取ります。encoding は、<Buffer> が受け入れる任意のものを指定できます。

fd が指定されている場合、ReadStreampath 引数を無視し、指定されたファイル記述子を使用します。これは、'open' イベントが発行されないことを意味します。fd はブロッキングである必要があります。非ブロッキングの fd は、<net.Socket> に渡す必要があります。

fd が (キーボードやサウンドカードなどの) ブロッキング読み取りのみをサポートする文字デバイスを指している場合、データが利用可能になるまで読み取り操作は完了しません。これにより、プロセスが終了できなくなり、ストリームが自然に閉じられない可能性があります。

デフォルトでは、ストリームは破棄された後に'close'イベントを発行します。この動作を変更するには、emitCloseオプションをfalseに設定します。

fs オプションを提供することにより、openread、および close の対応する fs 実装を上書きすることができます。fs オプションを提供する場合、read の上書きが必要です。fd が提供されていない場合は、open の上書きも必要です。autoClosetrue の場合は、close の上書きも必要です。

import { createReadStream } from 'node:fs';

// Create a stream from some character device.
const stream = createReadStream('/dev/input/event0');
setTimeout(() => {
  stream.close(); // This may not close the stream.
  // Artificially marking end-of-stream, as if the underlying resource had
  // indicated end-of-file by itself, allows the stream to close.
  // This does not cancel pending read operations, and if there is such an
  // operation, the process may still not be able to exit successfully
  // until it finishes.
  stream.push(null);
  stream.read(0);
}, 100); 

autoCloseがfalseの場合、エラーが発生した場合でもファイル記述子は閉じられません。それを閉じ、ファイル記述子のリークがないことを確認するのはアプリケーションの責任です。autoCloseがtrue(デフォルトの動作)に設定されている場合、'error'または'end'でファイル記述子が自動的に閉じられます。

mode はファイル モード (パーミッションとスティッキー ビット) を設定しますが、ファイルが作成された場合に限ります。

100バイトのファイルの最後の10バイトを読み取る例

import { createReadStream } from 'node:fs';

createReadStream('sample.txt', { start: 90, end: 99 }); 

options が文字列の場合、それはエンコーディングを指定します。

fs.createWriteStream(path[, options])#

options には、ファイルの先頭より後の位置にデータを書き込むことができる start オプションを含めることもできます。許容値は [0, Number.MAX_SAFE_INTEGER] の範囲です。ファイルを置換するのではなく変更する場合は、flags オプションをデフォルトの w ではなく r+ に設定する必要がある場合があります。encoding は、<Buffer> が受け入れる任意のものを指定できます。

autoCloseがtrue(デフォルトの動作)に設定されている場合、'error'または'finish'でファイル記述子が自動的に閉じられます。autoCloseがfalseの場合、エラーが発生した場合でもファイル記述子は閉じられません。それを閉じ、ファイル記述子のリークがないことを確認するのはアプリケーションの責任です。

デフォルトでは、ストリームは破棄された後に'close'イベントを発行します。この動作を変更するには、emitCloseオプションをfalseに設定します。

fs オプションを提供することにより、openwritewritev、および close の対応する fs 実装を上書きすることができます。writev() なしで write() を上書きすると、一部の最適化 (_writev()) が無効になるため、パフォーマンスが低下する可能性があります。fs オプションを提供する場合、少なくとも writewritev のどちらかの上書きが必要です。fd オプションが提供されていない場合は、open の上書きも必要です。autoClosetrue の場合は、close の上書きも必要です。

<fs.ReadStream> と同様に、fd が指定されている場合、<fs.WriteStream>path 引数を無視し、指定されたファイル記述子を使用します。これは、'open' イベントが発行されないことを意味します。fd はブロッキングである必要があります。非ブロッキングの fd は、<net.Socket> に渡す必要があります。

options が文字列の場合、それはエンコーディングを指定します。

fs.exists(path, callback)#

安定性: 0 - 非推奨: 代わりに fs.stat() または fs.access() を使用してください。

ファイルシステムで確認することにより、指定されたパスが存在するかどうかをテストします。その後、callback 引数を true または false のどちらかで呼び出します。

import { exists } from 'node:fs';

exists('/etc/passwd', (e) => {
  console.log(e ? 'it exists' : 'no passwd!');
}); 

このコールバックのパラメーターは、他の Node.js コールバックと一致していません。 通常、Node.js コールバックの最初のパラメーターは err パラメーターで、オプションで他のパラメーターが続きます。fs.exists() コールバックには、真偽値のパラメーターが 1 つだけあります。これが、fs.exists() の代わりに fs.access() を推奨する理由の 1 つです。

fs.open()fs.readFile()、または fs.writeFile() を呼び出す前に、fs.exists() を使用してファイルの存在を確認することは推奨されません。そうすると、他のプロセスが 2 回の呼び出しの間でファイルの状態を変更する可能性があるため、競合状態が発生します。代わりに、ユーザーコードはファイルを直接開く/読み取る/書き込み、ファイルが存在しない場合に発生するエラーを処理する必要があります。

書き込み(非推奨)

import { exists, open, close } from 'node:fs';

exists('myfile', (e) => {
  if (e) {
    console.error('myfile already exists');
  } else {
    open('myfile', 'wx', (err, fd) => {
      if (err) throw err;

      try {
        writeMyData(fd);
      } finally {
        close(fd, (err) => {
          if (err) throw err;
        });
      }
    });
  }
}); 

書き込み(推奨)

import { open, close } from 'node:fs';
open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
}); 

読み取り(非推奨)

import { open, close, exists } from 'node:fs';

exists('myfile', (e) => {
  if (e) {
    open('myfile', 'r', (err, fd) => {
      if (err) throw err;

      try {
        readMyData(fd);
      } finally {
        close(fd, (err) => {
          if (err) throw err;
        });
      }
    });
  } else {
    console.error('myfile does not exist');
  }
}); 

読み取り(推奨)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
}); 

上記の「推奨されない」例では、存在を確認してからファイルを使用します。一方、「推奨される」例は、ファイルを直接使用し、エラー (存在する場合) を処理するため、より優れています。

一般的に、ファイルの存在を確認するのは、ファイルが直接使用されない場合 (たとえば、その存在が別のプロセスからのシグナルである場合) のみです。

fs.fchmod(fd, mode, callback)#

ファイルに対する権限を設定します。完了コールバックには、起こりうる例外以外の引数は渡されません。

詳細については、POSIX の fchmod(2) のドキュメントを参照してください。

fs.fchown(fd, uid, gid, callback)#

ファイルの所有者を設定します。完了コールバックには、起こりうる例外以外の引数は渡されません。

詳細については、POSIX の fchown(2) のドキュメントを参照してください。

fs.fdatasync(fd, callback)#

ファイルに関連付けられている現在キューに登録されているすべての I/O 操作を、オペレーティング システムの同期 I/O 完了状態に強制します。詳細については、POSIX の fdatasync(2) のドキュメントを参照してください。完了コールバックには、起こりうる例外以外の引数は渡されません。

fs.fstat(fd[, options], callback)#

ファイル記述子の <fs.Stats> を使用してコールバックを呼び出します。

詳細については、POSIX の fstat(2) のドキュメントを参照してください。

fs.fsync(fd, callback)#

オープン ファイル記述子のすべてのデータをストレージ デバイスにフラッシュするように要求します。特定の実装は、オペレーティング システムとデバイスに固有です。詳細については、POSIX の fsync(2) のドキュメントを参照してください。完了コールバックには、起こりうる例外以外の引数は渡されません。

fs.ftruncate(fd[, len], callback)#

ファイル記述子を切り詰めます。完了コールバックには、起こりうる例外以外の引数は渡されません。

詳細については、POSIX の ftruncate(2) のドキュメントを参照してください。

ファイル記述子が参照するファイルが len バイトよりも大きい場合、ファイルの最初の len バイトのみが保持されます。

たとえば、次のプログラムでは、ファイルの最初の 4 バイトのみが保持されます。

import { open, close, ftruncate } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('temp.txt', 'r+', (err, fd) => {
  if (err) throw err;

  try {
    ftruncate(fd, 4, (err) => {
      closeFd(fd);
      if (err) throw err;
    });
  } catch (err) {
    closeFd(fd);
    if (err) throw err;
  }
}); 

ファイルが以前に len バイトより短かった場合は拡張され、拡張された部分はヌルバイト ('\0') で埋められます。

len が負の場合、0 が使用されます。

fs.futimes(fd, atime, mtime, callback)#

指定されたファイル記述子が参照するオブジェクトのファイルシステムのタイムスタンプを変更します。fs.utimes()を参照してください。

fs.lchmod(path, mode, callback)#

シンボリックリンクのパーミッションを変更します。完了コールバックには、発生しうる例外以外の引数は渡されません。

このメソッドは macOS でのみ実装されています。

詳細はPOSIXのlchmod(2)ドキュメントを参照してください。

fs.lchown(path, uid, gid, callback)#

シンボリックリンクの所有者を設定します。完了コールバックには、発生しうる例外以外の引数は渡されません。

詳細はPOSIXのlchown(2)ドキュメントを参照してください。

fs.lutimes(path, atime, mtime, callback)#

fs.utimes()と同じようにファイルのアクセス時間と変更時間を変更しますが、パスがシンボリックリンクを参照する場合、リンクは非参照化されません。代わりに、シンボリックリンク自体のタイムスタンプが変更されます。

完了コールバックには、発生しうる例外以外の引数は渡されません。

fs.link(existingPath, newPath, callback)#

existingPathからnewPathへの新しいリンクを作成します。詳細はPOSIXのlink(2)ドキュメントを参照してください。完了コールバックには、発生しうる例外以外の引数は渡されません。

fs.lstat(path[, options], callback)#

パスで参照されるシンボリックリンクの<fs.Stats>を取得します。コールバックは、2つの引数 (err, stats) を受け取ります。ここで stats<fs.Stats>オブジェクトです。lstat()stat() と同じですが、path がシンボリックリンクの場合、参照先のファイルではなく、リンク自体が stat されます。

詳細はPOSIXのlstat(2)ドキュメントを参照してください。

fs.mkdir(path[, options], callback)#

非同期的にディレクトリを作成します。

コールバックには、発生しうる例外と、recursivetrue の場合は、最初に作成されたディレクトリパス、(err[, path]) が渡されます。recursivetrue の場合でも、ディレクトリが作成されなかった (たとえば、以前に作成されていた場合) 場合、pathundefined になることがあります。

オプションの options 引数は、mode (パーミッションとスティッキービット) を指定する整数、または親ディレクトリを作成するかどうかを示す mode プロパティと recursive プロパティを持つオブジェクトにすることができます。path が存在するディレクトリの場合に fs.mkdir() を呼び出すと、recursive が false の場合にのみエラーが発生します。recursive が false でディレクトリが存在する場合、EEXIST エラーが発生します。

import { mkdir } from 'node:fs';

// Create ./tmp/a/apple, regardless of whether ./tmp and ./tmp/a exist.
mkdir('./tmp/a/apple', { recursive: true }, (err) => {
  if (err) throw err;
}); 

Windows では、再帰を使用してもルートディレクトリで fs.mkdir() を使用するとエラーが発生します

import { mkdir } from 'node:fs';

mkdir('/', { recursive: true }, (err) => {
  // => [Error: EPERM: operation not permitted, mkdir 'C:\']
}); 

詳細はPOSIXのmkdir(2)ドキュメントを参照してください。

fs.mkdtemp(prefix[, options], callback)#

一意な一時ディレクトリを作成します。

一意な一時ディレクトリを作成するために、必須の prefix の後ろに付加される 6 つのランダムな文字を生成します。プラットフォームの不整合のため、prefix の末尾に X 文字を使用することは避けてください。一部のプラットフォーム、特にBSDでは、6つ以上のランダムな文字を返し、prefix の末尾の X 文字をランダムな文字に置き換えることができます。

作成されたディレクトリパスは、コールバックの2番目のパラメータとして文字列で渡されます。

オプションの options 引数には、エンコーディングを指定する文字列、または使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。

import { mkdtemp } from 'node:fs';
import { join } from 'node:path';
import { tmpdir } from 'node:os';

mkdtemp(join(tmpdir(), 'foo-'), (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // Prints: /tmp/foo-itXde2 or C:\Users\...\AppData\Local\Temp\foo-itXde2
}); 

fs.mkdtemp() メソッドは、6つのランダムに選択された文字を prefix 文字列に直接追加します。たとえば、ディレクトリが /tmp の場合、/tmp *内* に一時ディレクトリを作成したい場合は、prefix は末尾にプラットフォーム固有のパス区切り文字 (require('node:path').sep) を付ける必要があります。

import { tmpdir } from 'node:os';
import { mkdtemp } from 'node:fs';

// The parent directory for the new temporary directory
const tmpDir = tmpdir();

// This method is *INCORRECT*:
mkdtemp(tmpDir, (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // Will print something similar to `/tmpabc123`.
  // A new temporary directory is created at the file system root
  // rather than *within* the /tmp directory.
});

// This method is *CORRECT*:
import { sep } from 'node:path';
mkdtemp(`${tmpDir}${sep}`, (err, directory) => {
  if (err) throw err;
  console.log(directory);
  // Will print something similar to `/tmp/abc123`.
  // A new temporary directory is created within
  // the /tmp directory.
}); 

fs.open(path[, flags[, mode]], callback)#

非同期ファイルオープン。詳細はPOSIXのopen(2)ドキュメントを参照してください。

mode は、ファイルが作成された場合にのみファイルモード (パーミッションとスティッキービット) を設定します。Windowsでは、書き込みパーミッションのみを操作できます。fs.chmod()を参照してください。

コールバックは2つの引数 (err, fd) を受け取ります。

一部の文字 (< > : " / \ | ? *) は、ファイル、パス、名前空間の命名 に記載されているように、Windows で予約されています。NTFS では、ファイル名にコロンが含まれている場合、Node.js は この MSDN ページ に記載されているように、ファイルシステムストリームを開きます。

fs.open() に基づく関数も同様の動作をします。fs.writeFile()fs.readFile() など。

fs.openAsBlob(path[, options])#

安定度: 1 - 試験的

データが指定されたファイルによって裏付けられる<Blob>を返します。

ファイルは、<Blob> が作成された後に変更してはなりません。変更を加えると、<Blob> データの読み取りが DOMException エラーで失敗します。Blob が作成されたとき、およびディスク上でファイルデータが変更されたかどうかを検出するために各読み取りの前に、ファイルに対して同期 stat 操作が行われます。

import { openAsBlob } from 'node:fs';

const blob = await openAsBlob('the.file.txt');
const ab = await blob.arrayBuffer();
blob.stream();const { openAsBlob } = require('node:fs');

(async () => {
  const blob = await openAsBlob('the.file.txt');
  const ab = await blob.arrayBuffer();
  blob.stream();
})();

fs.opendir(path[, options], callback)#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • encoding <string> | <null> デフォルト: 'utf8'
    • bufferSize <number> ディレクトリから読み取るときに内部的にバッファリングされるディレクトリエントリの数。値を大きくするとパフォーマンスは向上しますが、メモリ使用量も増加します。デフォルト: 32
    • recursive <boolean> デフォルト: false
  • callback <Function>

ディレクトリを非同期的に開きます。詳細はPOSIXのopendir(3)ドキュメントを参照してください。

<fs.Dir> を作成します。これには、ディレクトリからの読み取りとクリーンアップのすべての追加機能が含まれています。

encoding オプションは、ディレクトリを開く際と、後続の読み取り操作時の path のエンコーディングを設定します。

fs.read(fd, buffer, offset, length, position, callback)#

  • fd <整数>
  • buffer <Buffer> | <TypedArray> | <DataView> データが書き込まれるバッファ。
  • offset <integer> buffer 内でデータを書き込む位置。
  • length <integer> 読み込むバイト数。
  • position <integer> | <bigint> | <null> ファイルの読み込みを開始する位置を指定します。positionnull または -1 の場合、データは現在のファイル位置から読み込まれ、ファイル位置が更新されます。position が負でない整数の場合、ファイル位置は変更されません。
  • callback <Function>

fd で指定されたファイルからデータを読み取ります。

コールバックには、3つの引数 (err, bytesRead, buffer) が渡されます。

ファイルが同時に変更されない場合、読み込まれたバイト数がゼロになったときにファイルの終わりに到達します。

このメソッドがutil.promisify()されたバージョンとして呼び出された場合、bytesRead および buffer プロパティを持つ Object の Promise を返します。

fs.read(fd[, options], callback)#

fs.read() 関数と同様に、このバージョンではオプションの options オブジェクトを受け取ります。options オブジェクトが指定されていない場合は、上記の値がデフォルトになります。

fs.read(fd, buffer[, options], callback)#

fs.read() 関数と同様に、このバージョンではオプションの options オブジェクトを受け取ります。options オブジェクトが指定されていない場合は、上記の値がデフォルトになります。

fs.readdir(path[, options], callback)#

ディレクトリの内容を読み取ります。コールバックは (err, files) の2つの引数を受け取ります。ここで、files はディレクトリ内のファイル名の配列であり、'.''..' は除外されます。

詳細については、POSIX のreaddir(3)ドキュメントを参照してください。

オプションの options 引数には、エンコーディングを指定する文字列、またはコールバックに渡されるファイル名に使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるファイル名は<Buffer> オブジェクトとして渡されます。

options.withFileTypestrue に設定されている場合、files 配列には <fs.Dirent> オブジェクトが含まれます。

fs.readFile(path[, options], callback)#

ファイルの全内容を非同期的に読み込みます。

import { readFile } from 'node:fs';

readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
}); 

コールバックには、2つの引数 (err, data) が渡されます。ここで、data はファイルの内容です。

エンコーディングが指定されていない場合、生のバッファが返されます。

optionsが文字列の場合、エンコーディングを指定します。

import { readFile } from 'node:fs';

readFile('/etc/passwd', 'utf8', callback); 

パスがディレクトリの場合、fs.readFile() および fs.readFileSync() の動作はプラットフォーム固有です。macOS、Linux、およびWindowsでは、エラーが返されます。FreeBSDでは、ディレクトリの内容の表現が返されます。

import { readFile } from 'node:fs';

// macOS, Linux, and Windows
readFile('<directory>', (err, data) => {
  // => [Error: EISDIR: illegal operation on a directory, read <directory>]
});

//  FreeBSD
readFile('<directory>', (err, data) => {
  // => null, <data>
}); 

AbortSignalを使用して進行中のリクエストを中断することができます。リクエストが中断された場合、コールバックは AbortError と共に呼び出されます。

import { readFile } from 'node:fs';

const controller = new AbortController();
const signal = controller.signal;
readFile(fileInfo[0].name, { signal }, (err, buf) => {
  // ...
});
// When you want to abort the request
controller.abort(); 

fs.readFile() 関数はファイル全体をバッファリングします。メモリコストを最小限に抑えるには、可能な場合は fs.createReadStream() を介したストリーミングを優先してください。

進行中のリクエストを中止しても、個々のオペレーティングシステムのリクエストが中止されるのではなく、内部バッファリングである fs.readFile の実行が中止されます。

ファイル記述子#
  1. 指定されたファイル記述子は、読み取りをサポートしている必要があります。
  2. ファイル記述子が path として指定されている場合、自動的に閉じられることはありません。
  3. 読み取りは現在の位置から開始されます。たとえば、ファイルにすでに 'Hello World' があり、ファイル記述子で6バイトが読み取られた場合、同じファイル記述子で fs.readFile() を呼び出すと、'Hello World' ではなく 'World' が返されます。
パフォーマンスに関する考慮事項#

fs.readFile() メソッドは、ファイルのコンテンツを一度に1チャンクずつメモリに非同期的に読み込み、各チャンクの間でイベントループを回転させることができます。これにより、読み取り操作が、基盤となるlibuvスレッドプールを使用している可能性のある他のアクティビティへの影響を軽減できますが、完全なファイルをメモリに読み込むのに時間がかかることを意味します。

追加の読み取りオーバーヘッドは、システムによって大きく異なり、読み取られるファイルの種類によって異なります。ファイルの種類が通常のファイル(たとえばパイプ)ではなく、Node.jsが実際のファイルサイズを判断できない場合、各読み取り操作は64KiBのデータをロードします。通常のファイルの場合、各読み取りは512 KiBのデータを処理します。

可能な限り高速なファイルコンテンツの読み取りを必要とするアプリケーションの場合、fs.read() を直接使用し、アプリケーションコードがファイル全体のコンテンツの読み取りを管理する方が適切です。

Node.js GitHub issue #25741 には、異なるNode.jsバージョンでの複数のファイルサイズの fs.readFile() のパフォーマンスに関する詳細な情報と分析が記載されています。

fs.readlink(path[, options], callback)#

path で参照されるシンボリックリンクの内容を読み取ります。コールバックは (err, linkString) の2つの引数を受け取ります。

詳細については、POSIX の readlink(2) ドキュメントを参照してください。

オプションの options 引数には、エンコーディングを指定する文字列、またはコールバックに渡されるリンクパスに使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるリンクパスは <Buffer> オブジェクトとして渡されます。

fs.readv(fd, buffers[, position], callback)#

readv()を使用して、fdで指定されたファイルから読み取り、ArrayBufferViewの配列に書き込みます。

positionは、ファイルの先頭からデータを読み取る必要があるオフセットです。typeof position !== 'number'の場合、データは現在の位置から読み取られます。

コールバックには、3つの引数 errbytesRead、およびbuffersが渡されます。bytesReadはファイルから読み取られたバイト数です。

このメソッドがutil.promisify()されたバージョンとして呼び出された場合、bytesReadbuffersプロパティを持つObjectのPromiseを返します。

fs.realpath(path[, options], callback)#

...、およびシンボリックリンクを解決することにより、標準的なパス名を非同期的に計算します。

標準的なパス名は必ずしも一意ではありません。ハードリンクとバインドマウントは、多くのパス名を介してファイルシステムエンティティを公開できます。

この関数は、realpath(3)のように動作しますが、いくつかの例外があります

  1. 大文字と小文字を区別しないファイルシステムでは、大文字と小文字の変換は実行されません。

  2. シンボリックリンクの最大数はプラットフォームに依存せず、通常、ネイティブの realpath(3) 実装がサポートするよりも(はるかに)高くなっています。

callback(err, resolvedPath) の2つの引数を受け取ります。相対パスを解決するために process.cwd を使用する場合があります。

UTF8 文字列に変換できるパスのみがサポートされています。

オプションの options 引数には、エンコーディングを指定する文字列、またはコールバックに渡されるパスに使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるパスは <Buffer> オブジェクトとして渡されます。

path がソケットまたはパイプに解決される場合、関数はそのオブジェクトのシステム依存の名前を返します。

fs.realpath.native(path[, options], callback)#

非同期 realpath(3)

callback(err, resolvedPath) の2つの引数を受け取ります。

UTF8 文字列に変換できるパスのみがサポートされています。

オプションの options 引数には、エンコーディングを指定する文字列、またはコールバックに渡されるパスに使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるパスは <Buffer> オブジェクトとして渡されます。

Linux では、Node.js が musl libc にリンクされている場合、この関数が動作するためには、procfs ファイルシステムが /proc にマウントされている必要があります。Glibc にはこの制限はありません。

fs.rename(oldPath, newPath, callback)#

oldPath のファイルを、newPath として指定されたパス名に非同期的に名前変更します。newPath がすでに存在する場合、上書きされます。newPath にディレクトリがある場合、代わりにエラーが発生します。完了コールバックには、可能性のある例外以外の引数は渡されません。

参照: rename(2)

import { rename } from 'node:fs';

rename('oldFile.txt', 'newFile.txt', (err) => {
  if (err) throw err;
  console.log('Rename complete!');
}); 

fs.rmdir(path[, options], callback)#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • maxRetries <integer> EBUSYEMFILEENFILEENOTEMPTY、または EPERM エラーが発生した場合、Node.js は、試行ごとに retryDelay ミリ秒ずつ長く線形バックオフ待機で操作を再試行します。このオプションは、再試行の回数を表します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 0
    • recursive <boolean> true の場合、再帰的なディレクトリ削除を実行します。再帰モードでは、操作は失敗時に再試行されます。デフォルト: false非推奨。
    • retryDelay <integer> 再試行の間隔をミリ秒単位で指定します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 100
  • callback <Function>

非同期rmdir(2)。完了コールバックには、可能性のある例外以外の引数は渡されません。

ファイル(ディレクトリではない)でfs.rmdir()を使用すると、WindowsではENOENTエラーが発生し、POSIXではENOTDIRエラーが発生します。

rm -rfUnixコマンドと同様の動作を実現するには、オプション{ recursive: true, force: true }を指定してfs.rm()を使用します。

fs.rm(path[, options], callback)#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • force <boolean> true の場合、path が存在しない場合は例外が無視されます。デフォルト: false
    • maxRetries <integer> EBUSYEMFILEENFILEENOTEMPTY、または EPERM エラーが発生した場合、Node.js は、試行ごとに retryDelay ミリ秒ずつ長く線形バックオフ待機で操作を再試行します。このオプションは、再試行の回数を表します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 0
    • recursive <boolean> trueの場合、再帰的な削除を実行します。再帰モードでは、失敗時に操作が再試行されます。デフォルト: false
    • retryDelay <integer> 再試行の間隔をミリ秒単位で指定します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 100
  • callback <Function>

ファイルとディレクトリを非同期的に削除します(標準のPOSIX rmユーティリティに基づいてモデル化されています)。完了コールバックには、可能性のある例外以外の引数は渡されません。

fs.stat(path[, options], callback)#

非同期 stat(2)。コールバックは (err, stats) の2つの引数を受け取ります。ここで、stats<fs.Stats> オブジェクトです。

エラーの場合、err.codeCommon System Errors のいずれかになります。

fs.stat() はシンボリックリンクに従います。リンク自体を確認するには、fs.lstat() を使用してください。

fs.open()fs.readFile()、または fs.writeFile() を呼び出す前に、ファイルの存在を確認するために fs.stat() を使用することは推奨されません。代わりに、ユーザーコードはファイルを直接開く/読み取る/書き込み、ファイルが利用できない場合に発生するエラーを処理する必要があります。

後で操作せずにファイルの存在を確認するには、fs.access() をお勧めします。

たとえば、次のディレクトリ構造があるとします

- txtDir
-- file.txt
- app.js 

次のプログラムは、指定されたパスの統計情報を確認します

import { stat } from 'node:fs';

const pathsToCheck = ['./txtDir', './txtDir/file.txt'];

for (let i = 0; i < pathsToCheck.length; i++) {
  stat(pathsToCheck[i], (err, stats) => {
    console.log(stats.isDirectory());
    console.log(stats);
  });
} 

結果の出力は次のようになります

true
Stats {
  dev: 16777220,
  mode: 16877,
  nlink: 3,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 14214262,
  size: 96,
  blocks: 0,
  atimeMs: 1561174653071.963,
  mtimeMs: 1561174614583.3518,
  ctimeMs: 1561174626623.5366,
  birthtimeMs: 1561174126937.2893,
  atime: 2019-06-22T03:37:33.072Z,
  mtime: 2019-06-22T03:36:54.583Z,
  ctime: 2019-06-22T03:37:06.624Z,
  birthtime: 2019-06-22T03:28:46.937Z
}
false
Stats {
  dev: 16777220,
  mode: 33188,
  nlink: 1,
  uid: 501,
  gid: 20,
  rdev: 0,
  blksize: 4096,
  ino: 14214074,
  size: 8,
  blocks: 8,
  atimeMs: 1561174616618.8555,
  mtimeMs: 1561174614584,
  ctimeMs: 1561174614583.8145,
  birthtimeMs: 1561174007710.7478,
  atime: 2019-06-22T03:36:56.619Z,
  mtime: 2019-06-22T03:36:54.584Z,
  ctime: 2019-06-22T03:36:54.584Z,
  birthtime: 2019-06-22T03:26:47.711Z
} 

fs.statfs(path[, options], callback)#

非同期 statfs(2)path を含むマウントされたファイルシステムに関する情報を返します。コールバックは (err, stats) の2つの引数を受け取ります。ここで、stats<fs.StatFs> オブジェクトです。

エラーの場合、err.codeCommon System Errors のいずれかになります。

fs.symlink(target, path[, type], callback)#

target を指す path という名前のリンクを作成します。完了コールバックには、発生する可能性のある例外以外に引数は渡されません。

詳細については、POSIX の symlink(2) ドキュメントを参照してください。

type 引数は Windows でのみ利用可能で、他のプラットフォームでは無視されます。'dir''file'、または 'junction' に設定できます。type 引数が文字列でない場合、Node.js は target の型を自動検出し、'file' または 'dir' を使用します。target が存在しない場合は、'file' が使用されます。Windows のジャンクションポイントは、宛先パスが絶対パスである必要があります。'junction' を使用する場合、target 引数は自動的に絶対パスに正規化されます。NTFS ボリューム上のジャンクションポイントは、ディレクトリのみを指すことができます。

相対ターゲットは、リンクの親ディレクトリに対する相対パスです。

import { symlink } from 'node:fs';

symlink('./mew', './mewtwo', callback); 

上記の例では、同じディレクトリ内の mew を指すシンボリックリンク mewtwo を作成します。

$ tree .
.
├── mew
└── mewtwo -> ./mew 

fs.truncate(path[, len], callback)#

ファイルを切り詰めます。完了コールバックには、発生する可能性のある例外以外に引数は渡されません。ファイル記述子を最初の引数として渡すこともできます。この場合、fs.ftruncate() が呼び出されます。

import { truncate } from 'node:fs';
// Assuming that 'path/file.txt' is a regular file.
truncate('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was truncated');
});const { truncate } = require('node:fs');
// Assuming that 'path/file.txt' is a regular file.
truncate('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was truncated');
});

ファイル記述子の受け渡しは非推奨であり、将来的にエラーがスローされる可能性があります。

詳細については、POSIX の truncate(2) ドキュメントを参照してください。

fs.unlink(path, callback)#

ファイルまたはシンボリックリンクを非同期的に削除します。完了コールバックには、発生する可能性のある例外以外に引数は渡されません。

import { unlink } from 'node:fs';
// Assuming that 'path/file.txt' is a regular file.
unlink('path/file.txt', (err) => {
  if (err) throw err;
  console.log('path/file.txt was deleted');
}); 

fs.unlink() は、空であるかどうかにかかわらず、ディレクトリでは機能しません。ディレクトリを削除するには、fs.rmdir() を使用してください。

詳細については、POSIX の unlink(2) ドキュメントを参照してください。

fs.unwatchFile(filename[, listener])#

filename での変更の監視を停止します。listener が指定されている場合は、その特定のリスナーのみが削除されます。それ以外の場合は、すべて のリスナーが削除され、実質的に filename の監視が停止します。

監視されていないファイル名で fs.unwatchFile() を呼び出すことは、エラーではなく、何もしない操作です。

fs.watch() を使用する方が、fs.watchFile() および fs.unwatchFile() よりも効率的です。可能な場合は、fs.watchFile() および fs.unwatchFile() の代わりに fs.watch() を使用する必要があります。

fs.utimes(path, atime, mtime, callback)#

path で参照されるオブジェクトのファイルシステムタイムスタンプを変更します。

atime および mtime 引数は、次のルールに従います。

  • 値は、Unix エポック時間を秒単位で表す数値、Date、または '123456789.0' のような数値文字列のいずれかになります。
  • 値を数値に変換できない場合、または NaNInfinity、または -Infinity の場合は、Error がスローされます。

fs.watch(filename[, options][, listener])#

  • filename <string> | <Buffer> | <URL>
  • options <string> | <Object>
    • persistent <boolean> ファイルが監視されている間、プロセスを実行し続けるかどうかを示します。デフォルト: true
    • recursive <boolean> すべてのサブディレクトリを監視するか、現在のディレクトリのみを監視するかを示します。これは、ディレクトリが指定されている場合に適用され、サポートされているプラットフォームでのみ適用されます(注意点を参照)。デフォルト: false
    • encoding <string> リスナーに渡されるファイル名に使用する文字エンコーディングを指定します。デフォルト: 'utf8'
    • signal <AbortSignal> は、AbortSignal を使用してウォッチャーを閉じることを許可します。
  • listener <Function> | <undefined> デフォルト: undefined
  • 返り値: <fs.FSWatcher>

filename での変更を監視します。filename はファイルまたはディレクトリのいずれかです。

2 番目の引数はオプションです。options が文字列として指定されている場合は、encoding を指定します。それ以外の場合、options はオブジェクトとして渡す必要があります。

リスナーコールバックは、2 つの引数 (eventType, filename) を受け取ります。eventType'rename' または 'change' のいずれかで、filename はイベントをトリガーしたファイルの名前です。

ほとんどのプラットフォームでは、ディレクトリ内でファイル名が表示または非表示になるたびに、'rename'が発行されます。

リスナーコールバックは、<fs.FSWatcher> によって発生する 'change' イベントにアタッチされますが、eventType'change' 値と同じものではありません。

signal が渡された場合、対応する AbortController を中止すると、返された <fs.FSWatcher> が閉じられます。

注意点#

fs.watch API はプラットフォーム間で 100% 一貫性があるわけではなく、一部の状況では利用できません。

Windows では、監視対象のディレクトリが移動または名前変更された場合、イベントは発生しません。監視対象のディレクトリが削除されると、EPERM エラーが報告されます。

可用性#

この機能は、ファイルシステムの変更を通知する方法を提供する基盤となるオペレーティングシステムに依存します。

  • Linux システムでは、これは inotify(7) を使用します。
  • BSD システムでは、これは kqueue(2) を使用します。
  • macOS では、これはファイルには kqueue(2) を使用し、ディレクトリには FSEvents を使用します。
  • SunOS システム (Solaris および SmartOS を含む) では、これは event ports を使用します。
  • Windows システムでは、この機能は ReadDirectoryChangesW に依存します。
  • AIX システムでは、この機能は AHAFS に依存します。これは有効にする必要があります。
  • IBM i システムでは、この機能はサポートされていません。

基盤となる機能が何らかの理由で利用できない場合、fs.watch() は機能できず、例外をスローする可能性があります。たとえば、Vagrant や Docker などの仮想化ソフトウェアを使用する場合、ネットワークファイルシステム (NFS、SMB など) またはホストファイルシステムでのファイルまたはディレクトリの監視は信頼性が低く、場合によっては不可能です。

stat ポーリングを使用する fs.watchFile() を使用することもできますが、この方法は低速で信頼性が低くなります。

Inode#

Linux および macOS システムでは、fs.watch() はパスを inode に解決し、inode を監視します。監視対象のパスが削除されて再作成された場合、新しい inode が割り当てられます。ウォッチは削除のイベントを発行しますが、元の inode の監視を続けます。新しい inode のイベントは発行されません。これは想定された動作です。

AIX ファイルは、ファイルの有効期間中、同じ inode を保持します。AIX で監視対象のファイルを保存して閉じると、2 つの通知 (新しいコンテンツの追加と切り詰めの 1 つ) が発生します。

Filename 引数#

コールバックで filename 引数を指定することは、Linux、macOS、Windows、および AIX でのみサポートされています。サポートされているプラットフォームでも、filename が常に提供されるとは限りません。したがって、filename 引数が常にコールバックで提供されるとは想定しないでください。また、null の場合に備えてフォールバックロジックを用意してください。

import { watch } from 'node:fs';
watch('somedir', (eventType, filename) => {
  console.log(`event type is: ${eventType}`);
  if (filename) {
    console.log(`filename provided: ${filename}`);
  } else {
    console.log('filename not provided');
  }
}); 

fs.watchFile(filename[, options], listener)#

filename での変更を監視します。ファイルがアクセスされるたびに、コールバック listener が呼び出されます。

options 引数は省略できます。提供される場合、オブジェクトである必要があります。options オブジェクトには、ファイルの監視中にプロセスが実行を継続する必要があるかどうかを示すブール値の名前付き persistent が含まれる場合があります。options オブジェクトでは、ターゲットをポーリングする頻度をミリ秒単位で示す interval プロパティを指定できます。

listener は、現在の stat オブジェクトと前の stat オブジェクトの 2 つの引数を受け取ります。

import { watchFile } from 'node:fs';

watchFile('message.text', (curr, prev) => {
  console.log(`the current mtime is: ${curr.mtime}`);
  console.log(`the previous mtime was: ${prev.mtime}`);
}); 

これらの stat オブジェクトは fs.Stat のインスタンスです。bigint オプションが true の場合、これらのオブジェクトの数値は BigInt として指定されます。

ファイルがアクセスされただけでなく、変更されたときに通知を受けるには、curr.mtimeMsprev.mtimeMs を比較する必要があります。

fs.watchFile 操作で ENOENT エラーが発生した場合、リスナーはすべてのフィールドがゼロ化された状態 (または、日付の場合は Unix エポック) で 1 回呼び出されます。ファイルが後で作成された場合、リスナーは最新の stat オブジェクトを使用して再度呼び出されます。これは v0.10 以降の機能の変更です。

fs.watch() を使用する方が、fs.watchFile および fs.unwatchFile よりも効率的です。可能な場合は、fs.watchFile および fs.unwatchFile の代わりに fs.watch を使用する必要があります。

fs.watchFile() によって監視されているファイルが消えて再表示された場合、2 番目のコールバックイベント (ファイルの再表示) の previous の内容は、最初のコールバックイベント (ファイルの消失) の previous の内容と同じになります。

これは次の場合に発生します

  • ファイルが削除され、その後に復元された場合
  • ファイルの名前が変更され、その後、2 回目に元の名前に名前変更された場合

fs.write(fd, buffer, offset[, length[, position]], callback)#

bufferfd で指定されたファイルに書き込みます。

offset は書き込むバッファの部分を決定し、length は書き込むバイト数を指定する整数です。

position は、このデータを書き込む必要があるファイルの先頭からのオフセットを指します。typeof position !== 'number' の場合、データは現在の位置に書き込まれます。 pwrite(2) を参照してください。

コールバックには、(err, bytesWritten, buffer) の3つの引数が渡されます。ここで、bytesWritten は、buffer から書き込まれたバイト数を指定します。

このメソッドが util.promisify() されたバージョンとして呼び出された場合、bytesWritten および buffer プロパティを持つ Object の Promise を返します。

コールバックを待たずに同じファイルで fs.write() を複数回使用するのは安全ではありません。 このシナリオでは、fs.createWriteStream() が推奨されます。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの末尾に追加します。

fs.write(fd, buffer[, options], callback)#

bufferfd で指定されたファイルに書き込みます。

上記の fs.write 関数と同様に、このバージョンはオプションの options オブジェクトを受け取ります。 options オブジェクトが指定されていない場合、上記の値がデフォルトで使用されます。

fs.write(fd, string[, position[, encoding]], callback)#

stringfd で指定されたファイルに書き込みます。 string が文字列でない場合、例外がスローされます。

position は、このデータを書き込む必要があるファイルの先頭からのオフセットを指します。typeof position !== 'number' の場合、データは現在の位置に書き込まれます。 pwrite(2) を参照してください。

encoding は、予期される文字列エンコーディングです。

コールバックは、引数 (err, written, string) を受け取ります。ここで written は、渡された文字列を書き込むのに必要なバイト数を指定します。書き込まれたバイト数は、書き込まれた文字列の文字数と必ずしも同じではありません。 Buffer.byteLength を参照してください。

コールバックを待たずに同じファイルで fs.write() を複数回使用するのは安全ではありません。 このシナリオでは、fs.createWriteStream() が推奨されます。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの末尾に追加します。

Windows では、ファイル記述子がコンソール (例: fd == 1 または stdout) に接続されている場合、使用されているエンコーディングに関係なく、非 ASCII 文字を含む文字列はデフォルトでは適切にレンダリングされません。 chcp 65001 コマンドでアクティブなコードページを変更することにより、コンソールが UTF-8 を適切にレンダリングするように構成できます。詳細については、chcp ドキュメントを参照してください。

fs.writeFile(file, data[, options], callback)#

file がファイル名の場合、非同期的にデータをファイルに書き込み、ファイルが既に存在する場合は置き換えます。data は、文字列またはバッファにすることができます。

file がファイル記述子の場合、動作は fs.write() を直接呼び出すのと同様です (推奨)。ファイル記述子の使用に関する以下の注を参照してください。

dataがバッファーの場合、encodingオプションは無視されます。

mode オプションは、新しく作成されたファイルにのみ影響します。詳細については、fs.open() を参照してください。

import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';

const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, (err) => {
  if (err) throw err;
  console.log('The file has been saved!');
}); 

optionsが文字列の場合、エンコーディングを指定します。

import { writeFile } from 'node:fs';

writeFile('message.txt', 'Hello Node.js', 'utf8', callback); 

コールバックを待たずに同じファイルで fs.writeFile() を複数回使用するのは安全ではありません。このシナリオでは、fs.createWriteStream() が推奨されます。

fs.readFile と同様に、fs.writeFile は、渡されたバッファを書き込むために内部で複数の write 呼び出しを実行する便利なメソッドです。パフォーマンスが重要なコードでは、fs.createWriteStream() の使用を検討してください。

<AbortSignal> を使用して、fs.writeFile() をキャンセルできます。キャンセルは「ベストエフォート」であり、ある程度のデータはまだ書き込まれる可能性があります。

import { writeFile } from 'node:fs';
import { Buffer } from 'node:buffer';

const controller = new AbortController();
const { signal } = controller;
const data = new Uint8Array(Buffer.from('Hello Node.js'));
writeFile('message.txt', data, { signal }, (err) => {
  // When a request is aborted - the callback is called with an AbortError
});
// When the request should be aborted
controller.abort(); 

進行中のリクエストを中止しても、個々のオペレーティングシステムのリクエストは中止されず、fs.writeFileが実行する内部バッファリングが中止されます。

ファイル記述子で fs.writeFile() を使用する#

file がファイル記述子の場合、動作は次のように fs.write() を直接呼び出すのとほぼ同じです。

import { write } from 'node:fs';
import { Buffer } from 'node:buffer';

write(fd, Buffer.from(data, options.encoding), callback); 

fs.write() を直接呼び出す場合との違いは、いくつかの異常な条件下では、fs.write() がバッファの一部のみを書き込み、残りのデータを書き込むために再試行する必要があるのに対し、fs.writeFile() はデータが完全に書き込まれるまで (またはエラーが発生するまで) 再試行することです。

これの影響は、混乱の一般的な原因です。ファイル記述子の場合、ファイルは置き換えられません! データは必ずしもファイルの先頭に書き込まれるわけではなく、ファイルの元のデータは、新しく書き込まれたデータの前または後に残る可能性があります。

たとえば、fs.writeFile() が連続して2回呼び出され、最初に文字列 'Hello' を書き込み、次に文字列 ', World' を書き込む場合、ファイルには 'Hello, World' が含まれ、ファイルの元のデータの一部が含まれる可能性があります (元のファイルのサイズとファイル記述子の位置によって異なります)。記述子ではなくファイル名が使用されていた場合、ファイルには ', World' のみが含まれることが保証されます。

fs.writev(fd, buffers[, position], callback)#

writev() を使用して、ArrayBufferView の配列を fd で指定されたファイルに書き込みます。

position は、このデータを書き込む必要があるファイルの先頭からのオフセットです。typeof position !== 'number' の場合、データは現在の位置に書き込まれます。

コールバックには、3つの引数 errbytesWritten、および buffers が渡されます。bytesWritten は、buffers から書き込まれたバイト数です。

このメソッドが util.promisify() されている場合、bytesWritten および buffers プロパティを持つ Object の Promise を返します。

コールバックを待たずに同じファイルで fs.writev() を複数回使用するのは安全ではありません。このシナリオでは、fs.createWriteStream() を使用してください。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの末尾に追加します。

同期 API#

同期 API は、すべての操作を同期的に実行し、操作が完了または失敗するまでイベント ループをブロックします。

fs.accessSync(path[, mode])#

path で指定されたファイルまたはディレクトリに対するユーザーの権限を同期的にテストします。 mode 引数は、実行するアクセシビリティ チェックを指定するオプションの整数です。 mode は、値 fs.constants.F_OK、または fs.constants.R_OKfs.constants.W_OK、および fs.constants.X_OK のいずれかのビット単位の OR で構成されるマスク (例: fs.constants.W_OK | fs.constants.R_OK) のいずれかである必要があります。 mode の可能な値については、ファイル アクセス定数 を確認してください。

いずれかのアクセシビリティ チェックが失敗した場合、Error がスローされます。それ以外の場合、メソッドは undefined を返します。

import { accessSync, constants } from 'node:fs';

try {
  accessSync('etc/passwd', constants.R_OK | constants.W_OK);
  console.log('can read/write');
} catch (err) {
  console.error('no access!');
} 

fs.appendFileSync(path, data[, options])#

ファイルが存在しない場合は作成し、ファイルにデータを同期的に追加します。data は、文字列または <Buffer> にすることができます。

mode オプションは、新しく作成されたファイルにのみ影響します。詳細については、fs.open() を参照してください。

import { appendFileSync } from 'node:fs';

try {
  appendFileSync('message.txt', 'data to append');
  console.log('The "data to append" was appended to file!');
} catch (err) {
  /* Handle the error */
} 

optionsが文字列の場合、エンコーディングを指定します。

import { appendFileSync } from 'node:fs';

appendFileSync('message.txt', 'data to append', 'utf8'); 

pathは、(fs.open()またはfs.openSync()を使用して)追加用に開かれている数値ファイルディスクリプターとして指定できます。ファイルディスクリプターは自動的に閉じられません。

import { openSync, closeSync, appendFileSync } from 'node:fs';

let fd;

try {
  fd = openSync('message.txt', 'a');
  appendFileSync(fd, 'data to append', 'utf8');
} catch (err) {
  /* Handle the error */
} finally {
  if (fd !== undefined)
    closeSync(fd);
} 

fs.chmodSync(path, mode)#

詳細については、この API の非同期バージョンのドキュメント (fs.chmod()) を参照してください。

詳細については、POSIX chmod(2)のドキュメントを参照してください。

fs.chownSync(path, uid, gid)#

ファイルの所有者とグループを同期的に変更します。 undefined を返します。 これは、fs.chown() の同期バージョンです。

詳細については、POSIX の chown(2) のドキュメントを参照してください。

fs.closeSync(fd)#

ファイル記述子を閉じます。 undefined を返します。

他のfs操作で現在使用中のファイル記述子(fd)に対してfs.closeSync()を呼び出すと、未定義の動作につながる可能性があります。

詳細については、POSIX の close(2) のドキュメントを参照してください。

fs.copyFileSync(src, dest[, mode])#

srcdestに同期的にコピーします。デフォルトでは、destが既に存在する場合は上書きされます。undefinedを返します。Node.jsはコピー操作の原子性について保証しません。書き込みのために宛先ファイルを開いた後にエラーが発生した場合、Node.jsは宛先を削除しようとします。

mode は、コピー操作の動作を指定するオプションの整数です。2 つ以上の値のビット単位の OR で構成されるマスクを作成できます (例: fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE)。

  • fs.constants.COPYFILE_EXCL: dest が既に存在する場合、コピー操作は失敗します。
  • fs.constants.COPYFILE_FICLONE: コピー操作は、コピーオンライトの reflink を作成しようとします。プラットフォームがコピーオンライトをサポートしていない場合は、フォールバックコピーメカニズムが使用されます。
  • fs.constants.COPYFILE_FICLONE_FORCE: コピー操作は、コピーオンライトの reflink を作成しようとします。プラットフォームがコピーオンライトをサポートしていない場合、操作は失敗します。
import { copyFileSync, constants } from 'node:fs';

// destination.txt will be created or overwritten by default.
copyFileSync('source.txt', 'destination.txt');
console.log('source.txt was copied to destination.txt');

// By using COPYFILE_EXCL, the operation will fail if destination.txt exists.
copyFileSync('source.txt', 'destination.txt', constants.COPYFILE_EXCL); 

fs.cpSync(src, dest[, options])#

安定度: 1 - 試験的

  • src <文字列> | <URL> コピー元のパス。
  • dest <文字列> | <URL> コピー先のパス。
  • options <Object>
    • dereference <真偽値> シンボリックリンクを非参照化します。デフォルト: false
    • errorOnExist <真偽値> forcefalse で、コピー先が存在する場合、エラーをスローします。デフォルト: false
    • filter <Function> コピーするファイル/ディレクトリをフィルタリングする関数。アイテムをコピーする場合はtrueを、無視する場合はfalseを返します。ディレクトリを無視すると、その内容もすべてスキップされます。デフォルト: undefined
    • force <真偽値> 既存のファイルまたはディレクトリを上書きします。この値を false に設定し、コピー先が存在する場合、コピー操作はエラーを無視します。この動作を変更するには、errorOnExist オプションを使用します。デフォルト: true
    • mode <integer> コピー操作の修飾子。デフォルト: 0fs.copyFileSync()modeフラグを参照してください。
    • preserveTimestamps <真偽値> true の場合、src からのタイムスタンプが保持されます。デフォルト: false
    • recursive <boolean> ディレクトリを再帰的にコピーします。デフォルト: false
    • verbatimSymlinks <boolean> true の場合、シンボリックリンクのパス解決をスキップします。デフォルト: false

サブディレクトリとファイルを含む、ディレクトリ構造全体をsrcからdestに同期的にコピーします。

あるディレクトリを別のディレクトリへコピーする場合、glob はサポートされず、cp dir1/ dir2/ と同様の動作になります。

fs.existsSync(path)#

パスが存在する場合はtrue、それ以外の場合はfalseを返します。

詳細については、このAPIの非同期バージョンのドキュメント: fs.exists()を参照してください。

fs.exists()は非推奨ですが、fs.existsSync()は非推奨ではありません。fs.exists()へのcallbackパラメータは、他のNode.jsコールバックと一貫性のないパラメータを受け入れます。fs.existsSync()はコールバックを使用しません。

import { existsSync } from 'node:fs';

if (existsSync('/etc/passwd'))
  console.log('The path exists.'); 

fs.fchmodSync(fd, mode)#

ファイルのパーミッションを設定します。undefinedを返します。

詳細については、POSIX の fchmod(2) のドキュメントを参照してください。

fs.fchownSync(fd, uid, gid)#

  • fd <整数>
  • uid <integer> ファイルの新しい所有者のユーザーID。
  • gid <integer> ファイルの新しいグループのグループID。

ファイルの所有者を設定します。undefinedを返します。

詳細については、POSIX の fchown(2) のドキュメントを参照してください。

fs.fdatasyncSync(fd)#

ファイルに関連付けられた現在キューに入れられているすべてのI/O操作を、オペレーティングシステムの同期I/O完了状態に強制します。詳細については、POSIXのfdatasync(2)ドキュメントを参照してください。undefinedを返します。

fs.fstatSync(fd[, options])#

ファイル記述子の<fs.Stats>を取得します。

詳細については、POSIX の fstat(2) のドキュメントを参照してください。

fs.fsyncSync(fd)#

オープンファイル記述子のすべてのデータをストレージデバイスにフラッシュするように要求します。具体的な実装はオペレーティングシステムとデバイスに依存します。詳細については、POSIXのfsync(2)ドキュメントを参照してください。undefinedを返します。

fs.ftruncateSync(fd[, len])#

ファイル記述子を切り詰めます。undefinedを返します。

詳細については、このAPIの非同期バージョンのドキュメント: fs.ftruncate()を参照してください。

fs.futimesSync(fd, atime, mtime)#

fs.futimes()の同期バージョン。undefinedを返します。

fs.lchmodSync(path, mode)#

シンボリックリンクのパーミッションを変更します。undefinedを返します。

このメソッドは macOS でのみ実装されています。

詳細はPOSIXのlchmod(2)ドキュメントを参照してください。

fs.lchownSync(path, uid, gid)#

パスの所有者を設定します。undefinedを返します。

詳細については、POSIXのlchown(2)ドキュメントを参照してください。

fs.lutimesSync(path, atime, mtime)#

pathによって参照されるシンボリックリンクのファイルシステムタイムスタンプを変更します。パラメータが正しくない場合、または操作が失敗した場合はundefinedを返すか、例外をスローします。これは、fs.lutimes()の同期バージョンです。

fs.linkSync(existingPath, newPath)#

existingPathからnewPathへの新しいリンクを作成します。詳細については、POSIXのlink(2)ドキュメントを参照してください。undefinedを返します。

fs.lstatSync(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • bigint <boolean> 返される <fs.Stats> オブジェクトの数値が bigint であるべきかどうか。デフォルト: false
    • throwIfNoEntry <boolean> ファイルシステムエントリが存在しない場合に、undefinedを返すのではなく例外をスローするかどうか。デフォルト: true
  • 戻り値: <fs.Stats>

pathによって参照されるシンボリックリンクの<fs.Stats>を取得します。

詳細はPOSIXのlstat(2)ドキュメントを参照してください。

fs.mkdirSync(path[, options])#

ディレクトリを同期的に作成します。undefinedを返すか、recursivetrueの場合は、最初に作成されたディレクトリパスを返します。これは、fs.mkdir()の同期バージョンです。

詳細はPOSIXのmkdir(2)ドキュメントを参照してください。

fs.mkdtempSync(prefix[, options])#

作成されたディレクトリパスを返します。

詳細については、このAPIの非同期バージョンのドキュメント: fs.mkdtemp()を参照してください。

オプションの options 引数には、エンコーディングを指定する文字列、または使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。

fs.opendirSync(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • encoding <string> | <null> デフォルト: 'utf8'
    • bufferSize <number> ディレクトリから読み取るときに内部的にバッファリングされるディレクトリエントリの数。値を大きくするとパフォーマンスは向上しますが、メモリ使用量も増加します。デフォルト: 32
    • recursive <boolean> デフォルト: false
  • 戻り値: <fs.Dir>

ディレクトリを同期的に開きます。opendir(3)を参照してください。

<fs.Dir> を作成します。これには、ディレクトリからの読み取りとクリーンアップのすべての追加機能が含まれています。

encoding オプションは、ディレクトリを開く際と、後続の読み取り操作時の path のエンコーディングを設定します。

fs.openSync(path[, flags[, mode]])#

ファイル記述子を表す整数を返します。

詳細については、このAPIの非同期バージョンのドキュメント: fs.open()を参照してください。

fs.readdirSync(path[, options])#

ディレクトリの内容を読み取ります。

詳細については、POSIX のreaddir(3)ドキュメントを参照してください。

オプションのoptions引数は、エンコーディングを指定する文字列、または返されるファイル名に使用する文字エンコーディングを指定するencodingプロパティを持つオブジェクトにすることができます。 encoding'buffer'に設定されている場合、返されるファイル名は<Buffer>オブジェクトとして渡されます。

options.withFileTypestrueに設定されている場合、結果には<fs.Dirent>オブジェクトが含まれます。

fs.readFileSync(path[, options])#

pathの内容を返します。

詳細については、このAPIの非同期バージョンのドキュメント: fs.readFile()を参照してください。

encodingオプションが指定されている場合、この関数は文字列を返します。それ以外の場合は、バッファを返します。

fs.readFile()と同様に、パスがディレクトリの場合、fs.readFileSync()の動作はプラットフォーム固有です。

import { readFileSync } from 'node:fs';

// macOS, Linux, and Windows
readFileSync('<directory>');
// => [Error: EISDIR: illegal operation on a directory, read <directory>]

//  FreeBSD
readFileSync('<directory>'); // => <data> 

fs.readlinkSync(path[, options])#

シンボリックリンクの文字列値を返します。

詳細については、POSIX の readlink(2) ドキュメントを参照してください。

オプションの options 引数には、エンコーディングを指定する文字列、または、返されるリンクパスに使用する文字エンコーディングを指定する encoding プロパティを持つオブジェクトを指定できます。encoding'buffer' に設定されている場合、返されるリンクパスは <Buffer> オブジェクトとして渡されます。

fs.readSync(fd, buffer, offset, length[, position])#

bytesReadの数を返します。

詳細については、このAPIの非同期バージョンのドキュメント: fs.read()を参照してください。

fs.readSync(fd, buffer[, options])#

bytesReadの数を返します。

上記のfs.readSync関数と同様に、このバージョンはオプションのoptionsオブジェクトを受け取ります。optionsオブジェクトが指定されていない場合は、上記のデフォルト値になります。

詳細については、このAPIの非同期バージョンのドキュメント: fs.read()を参照してください。

fs.readvSync(fd, buffers[, position])#

詳細については、このAPIの非同期バージョンのドキュメント: fs.readv()を参照してください。

fs.realpathSync(path[, options])#

解決されたパス名を返します。

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.realpath()

fs.realpathSync.native(path[, options])#

同期的なrealpath(3)です。

UTF8 文字列に変換できるパスのみがサポートされています。

オプションのoptions引数には、エンコーディングを指定する文字列、または返されるパスに使用する文字エンコーディングを指定するencodingプロパティを持つオブジェクトを指定できます。encoding'buffer'に設定されている場合、返されるパスは<Buffer>オブジェクトとして渡されます。

Linux では、Node.js が musl libc にリンクされている場合、この関数が動作するためには、procfs ファイルシステムが /proc にマウントされている必要があります。Glibc にはこの制限はありません。

fs.renameSync(oldPath, newPath)#

oldPathからnewPathにファイル名を変更します。undefinedを返します。

詳細については、POSIXのrename(2)ドキュメントを参照してください。

fs.rmdirSync(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • maxRetries <integer> EBUSYEMFILEENFILEENOTEMPTY、または EPERM エラーが発生した場合、Node.js は、試行ごとに retryDelay ミリ秒ずつ長く線形バックオフ待機で操作を再試行します。このオプションは、再試行の回数を表します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 0
    • recursive <boolean> true の場合、再帰的なディレクトリ削除を実行します。再帰モードでは、操作は失敗時に再試行されます。デフォルト: false非推奨。
    • retryDelay <integer> 再試行の間隔をミリ秒単位で指定します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 100

同期的なrmdir(2)です。undefinedを返します。

ファイル(ディレクトリではない)に対してfs.rmdirSync()を使用すると、WindowsではENOENTエラー、POSIXではENOTDIRエラーが発生します。

rm -rf Unixコマンドと同様の動作を得るには、オプション{ recursive: true, force: true }を指定してfs.rmSync()を使用してください。

fs.rmSync(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • force <boolean> true の場合、path が存在しない場合は例外が無視されます。デフォルト: false
    • maxRetries <integer> EBUSYEMFILEENFILEENOTEMPTY、または EPERM エラーが発生した場合、Node.js は、試行ごとに retryDelay ミリ秒ずつ長く線形バックオフ待機で操作を再試行します。このオプションは、再試行の回数を表します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 0
    • recursive <boolean> true の場合、再帰的なディレクトリ削除を実行します。再帰モードでは、操作は失敗時に再試行されます。デフォルト: false
    • retryDelay <integer> 再試行の間隔をミリ秒単位で指定します。このオプションは、recursive オプションが true でない場合は無視されます。デフォルト: 100

ファイルを同期的に削除します(標準POSIX rmユーティリティをモデル化)。undefinedを返します。

fs.statSync(path[, options])#

  • path <文字列> | <Buffer> | <URL>
  • options <Object>
    • bigint <boolean> 返される <fs.Stats> オブジェクトの数値が bigint であるべきかどうか。デフォルト: false
    • throwIfNoEntry <boolean> ファイルシステムエントリが存在しない場合に、undefinedを返すのではなく例外をスローするかどうか。デフォルト: true
  • 戻り値: <fs.Stats>

パスの<fs.Stats>を取得します。

fs.statfsSync(path[, options])#

同期的なstatfs(2)です。pathを含むマウントされたファイルシステムに関する情報を返します。

エラーの場合、err.codeCommon System Errors のいずれかになります。

fs.symlinkSync(target, path[, type])#

undefinedを返します。

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.symlink()

fs.truncateSync(path[, len])#

ファイルを切り詰めます。undefinedを返します。ファイルディスクリプタを最初の引数として渡すこともできます。この場合、fs.ftruncateSync()が呼び出されます。

ファイル記述子の受け渡しは非推奨であり、将来的にエラーがスローされる可能性があります。

fs.unlinkSync(path)#

同期的なunlink(2)です。undefinedを返します。

fs.utimesSync(path, atime, mtime)#

undefinedを返します。

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.utimes()

fs.writeFileSync(file, data[, options])#

undefinedを返します。

mode オプションは、新しく作成されたファイルにのみ影響します。詳細については、fs.open() を参照してください。

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.writeFile()

fs.writeSync(fd, buffer, offset[, length[, position]])#

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.write(fd, buffer...)

fs.writeSync(fd, buffer[, options])#

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.write(fd, buffer...)

fs.writeSync(fd, string[, position[, encoding]])#

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.write(fd, string...)

fs.writevSync(fd, buffers[, position])#

詳細については、このAPIの非同期バージョンのドキュメントを参照してください: fs.writev()

共通オブジェクト#

共通オブジェクトは、すべてのファイルシステムAPIバリアント(promise、コールバック、同期)で共有されます。

クラス: fs.Dir#

ディレクトリ ストリームを表すクラス。

fs.opendir()fs.opendirSync()、またはfsPromises.opendir()によって作成されます。

import { opendir } from 'node:fs/promises';

try {
  const dir = await opendir('./');
  for await (const dirent of dir)
    console.log(dirent.name);
} catch (err) {
  console.error(err);
} 

非同期イテレータを使用する場合、イテレータが終了した後、<fs.Dir> オブジェクトは自動的に閉じられます。

dir.close()#

ディレクトリの基になるリソース ハンドルを非同期的に閉じます。後続の読み取りはエラーになります。

リソースが閉じられた後に解決されるPromiseが返されます。

dir.close(callback)#

ディレクトリの基になるリソース ハンドルを非同期的に閉じます。後続の読み取りはエラーになります。

リソースハンドルが閉じられた後、callbackが呼び出されます。

dir.closeSync()#

ディレクトリの基になるリソース ハンドルを同期的に閉じます。後続の読み取りはエラーになります。

dir.path#

このディレクトリの読み取り専用パス。これはfs.opendir()fs.opendirSync()、またはfsPromises.opendir()に提供されたものです。

dir.read()#

readdir(3)経由で次のディレクトリ エントリを<fs.Dirent>として非同期的に読み取ります。

読み取るディレクトリ エントリがなくなると、<fs.Dirent>、またはnullで解決されるPromiseが返されます。

この関数によって返されるディレクトリ エントリは、オペレーティング システムの基盤となるディレクトリ メカニズムによって提供されるように、特定の順序にはなっていません。ディレクトリの反復処理中に追加または削除されたエントリは、反復処理の結果に含まれない場合があります。

dir.read(callback)#

readdir(3)経由で次のディレクトリ エントリを<fs.Dirent>として非同期的に読み取ります。

読み取りが完了した後、読み取るディレクトリ エントリがなくなると、callback<fs.Dirent>、またはnullとともに呼び出されます。

この関数によって返されるディレクトリ エントリは、オペレーティング システムの基盤となるディレクトリ メカニズムによって提供されるように、特定の順序にはなっていません。ディレクトリの反復処理中に追加または削除されたエントリは、反復処理の結果に含まれない場合があります。

dir.readSync()#

次のディレクトリ エントリを<fs.Dirent>として同期的に読み取ります。詳細については、POSIXのreaddir(3)ドキュメントを参照してください。

読み取るディレクトリ エントリがなくなると、nullが返されます。

この関数によって返されるディレクトリ エントリは、オペレーティング システムの基盤となるディレクトリ メカニズムによって提供されるように、特定の順序にはなっていません。ディレクトリの反復処理中に追加または削除されたエントリは、反復処理の結果に含まれない場合があります。

dir[Symbol.asyncIterator]()#

すべてのエントリが読み取られるまで、ディレクトリを非同期的に反復処理します。詳細については、POSIXのreaddir(3)ドキュメントを参照してください。

非同期イテレーターによって返されるエントリは常に<fs.Dirent>です。dir.read()からのnullケースは内部的に処理されます。

例については、<fs.Dir>を参照してください。

このイテレーターによって返されるディレクトリ エントリは、オペレーティング システムの基盤となるディレクトリ メカニズムによって提供されるように、特定の順序にはなっていません。ディレクトリの反復処理中に追加または削除されたエントリは、反復処理の結果に含まれない場合があります。

クラス: fs.Dirent#

<fs.Dir>からの読み取りによって返される、ディレクトリ内のファイルまたはサブディレクトリである可能性のあるディレクトリ エントリの表現。ディレクトリ エントリは、ファイル名とファイル タイプのペアの組み合わせです。

さらに、fs.readdir()またはfs.readdirSync()withFileTypesオプションをtrueに設定して呼び出されると、結果の配列は、文字列または<Buffer>ではなく、<fs.Dirent>オブジェクトで埋められます。

dirent.isBlockDevice()#

<fs.Dirent>オブジェクトがブロック デバイスを表す場合はtrueを返します。

dirent.isCharacterDevice()#

<fs.Dirent>オブジェクトがキャラクタ デバイスを表す場合はtrueを返します。

dirent.isDirectory()#

<fs.Dirent>オブジェクトがファイル システム ディレクトリを表す場合はtrueを返します。

dirent.isFIFO()#

<fs.Dirent>オブジェクトが先入れ先出し(FIFO)パイプを表す場合はtrueを返します。

dirent.isFile()#

<fs.Dirent>オブジェクトが通常のファイルを表す場合はtrueを返します。

dirent.isSocket()#

<fs.Dirent>オブジェクトがソケットを表す場合はtrueを返します。

dirent.isSymbolicLink()#

<fs.Dirent> オブジェクトがシンボリックリンクを表す場合に true を返します。

dirent.name#

この <fs.Dirent> オブジェクトが参照するファイル名です。この値の型は、fs.readdir() または fs.readdirSync() に渡された options.encoding によって決定されます。

dirent.parentPath#

安定度: 1 - 試験的

この <fs.Dirent> オブジェクトが参照するファイルの親ディレクトリへのパスです。

dirent.path#

安定度: 0 - 非推奨: 代わりに dirent.parentPath を使用してください。

dirent.parentPath のエイリアスです。

クラス: fs.FSWatcher#

fs.watch() メソッドの呼び出しが成功すると、新しい <fs.FSWatcher> オブジェクトが返されます。

すべての <fs.FSWatcher> オブジェクトは、監視対象の特定のファイルが変更されるたびに 'change' イベントを発生させます。

イベント: 'change'#
  • eventType <string> 発生した変更イベントのタイプ
  • filename <string> | <Buffer> 変更されたファイル名(関連がある/利用可能な場合)

監視対象のディレクトリまたはファイルで何らかの変更があった場合に発生します。詳細については、fs.watch() を参照してください。

オペレーティングシステムのサポートによっては、filename 引数が提供されない場合があります。filename が提供される場合、fs.watch()encoding オプションを 'buffer' に設定して呼び出された場合は <Buffer> として提供され、それ以外の場合は filename は UTF-8 文字列になります。

import { watch } from 'node:fs';
// Example when handled through fs.watch() listener
watch('./tmp', { encoding: 'buffer' }, (eventType, filename) => {
  if (filename) {
    console.log(filename);
    // Prints: <Buffer ...>
  }
}); 
イベント: 'close'#

ウォッチャーが変更の監視を停止したときに発生します。クローズされた <fs.FSWatcher> オブジェクトは、イベントハンドラーではもう使用できません。

イベント: 'error'#

ファイルの監視中にエラーが発生した場合に発生します。エラーが発生した <fs.FSWatcher> オブジェクトは、イベントハンドラーではもう使用できません。

watcher.close()#

指定された <fs.FSWatcher> での変更の監視を停止します。停止すると、<fs.FSWatcher> オブジェクトはもう使用できません。

watcher.ref()#

呼び出されると、<fs.FSWatcher> がアクティブである限り、Node.js イベントループが終了しないように要求します。watcher.ref() を複数回呼び出しても効果はありません。

デフォルトでは、すべての <fs.FSWatcher> オブジェクトは「参照」されるため、通常は、以前に watcher.unref() が呼び出された場合を除き、watcher.ref() を呼び出す必要はありません。

watcher.unref()#

呼び出されると、アクティブな <fs.FSWatcher> オブジェクトは、Node.js イベントループがアクティブな状態を維持することを要求しません。イベントループを維持する他のアクティビティがない場合、プロセスは <fs.FSWatcher> オブジェクトのコールバックが呼び出される前に終了する可能性があります。watcher.unref() を複数回呼び出しても効果はありません。

クラス: fs.StatWatcher#

fs.watchFile() メソッドの呼び出しが成功すると、新しい <fs.StatWatcher> オブジェクトが返されます。

watcher.ref()#

呼び出されると、<fs.StatWatcher> がアクティブである限り、Node.js イベントループが終了しないように要求します。watcher.ref() を複数回呼び出しても効果はありません。

デフォルトでは、すべての <fs.StatWatcher> オブジェクトは「参照」されるため、通常は、以前に watcher.unref() が呼び出された場合を除き、watcher.ref() を呼び出す必要はありません。

watcher.unref()#

呼び出されると、アクティブな <fs.StatWatcher> オブジェクトは、Node.js イベントループがアクティブな状態を維持することを要求しません。イベントループを維持する他のアクティビティがない場合、プロセスは <fs.StatWatcher> オブジェクトのコールバックが呼び出される前に終了する可能性があります。watcher.unref() を複数回呼び出しても効果はありません。

クラス: fs.ReadStream#

<fs.ReadStream> のインスタンスは、fs.createReadStream() 関数を使用して作成および返されます。

イベント: 'close'#

<fs.ReadStream> の基になるファイル記述子が閉じられたときに発生します。

イベント: 'open'#

<fs.ReadStream> のファイル記述子が開かれたときに発生します。

イベント: 'ready'#

<fs.ReadStream> が使用できる状態になったときに発生します。

'open' の直後に発生します。

readStream.bytesRead#

これまでに読み込まれたバイト数。

readStream.path#

ストリームが読み込んでいるファイルのパス(fs.createReadStream() の最初の引数で指定されたもの)。path が文字列として渡された場合、readStream.path は文字列になります。path<Buffer> として渡された場合、readStream.path<Buffer> になります。fd が指定されている場合、readStream.pathundefined になります。

readStream.pending#

基になるファイルがまだ開かれていない場合、つまり 'ready' イベントが発生する前の場合、このプロパティは true です。

クラス: fs.Stats#

<fs.Stats> オブジェクトは、ファイルに関する情報を提供します。

fs.stat()fs.lstat()fs.fstat()、およびそれらの同期版から返されるオブジェクトは、この型です。これらのメソッドに渡される optionsbigint が true の場合、数値は number ではなく bigint になり、オブジェクトには Ns が付加されたナノ秒精度のプロパティが追加されます。

Stats {
  dev: 2114,
  ino: 48064969,
  mode: 33188,
  nlink: 1,
  uid: 85,
  gid: 100,
  rdev: 0,
  size: 527,
  blksize: 4096,
  blocks: 8,
  atimeMs: 1318289051000.1,
  mtimeMs: 1318289051000.1,
  ctimeMs: 1318289051000.1,
  birthtimeMs: 1318289051000.1,
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT } 

bigint バージョン

BigIntStats {
  dev: 2114n,
  ino: 48064969n,
  mode: 33188n,
  nlink: 1n,
  uid: 85n,
  gid: 100n,
  rdev: 0n,
  size: 527n,
  blksize: 4096n,
  blocks: 8n,
  atimeMs: 1318289051000n,
  mtimeMs: 1318289051000n,
  ctimeMs: 1318289051000n,
  birthtimeMs: 1318289051000n,
  atimeNs: 1318289051000000000n,
  mtimeNs: 1318289051000000000n,
  ctimeNs: 1318289051000000000n,
  birthtimeNs: 1318289051000000000n,
  atime: Mon, 10 Oct 2011 23:24:11 GMT,
  mtime: Mon, 10 Oct 2011 23:24:11 GMT,
  ctime: Mon, 10 Oct 2011 23:24:11 GMT,
  birthtime: Mon, 10 Oct 2011 23:24:11 GMT } 
stats.isBlockDevice()#

<fs.Stats> オブジェクトがブロックデバイスを表す場合に true を返します。

stats.isCharacterDevice()#

<fs.Stats> オブジェクトがキャラクタデバイスを表す場合に true を返します。

stats.isDirectory()#

<fs.Stats> オブジェクトがファイルシステムのディレクトリを表す場合に true を返します。

<fs.Stats> オブジェクトが、ディレクトリに解決されるシンボリックリンクで fs.lstat() を呼び出して取得された場合、このメソッドは false を返します。これは、fs.lstat() がシンボリックリンク自体に関する情報を返し、解決先のパスに関する情報を返さないためです。

stats.isFIFO()#

<fs.Stats> オブジェクトが FIFO (first-in-first-out) パイプを表す場合に true を返します。

stats.isFile()#

<fs.Stats> オブジェクトが通常のファイルを表す場合に true を返します。

stats.isSocket()#

<fs.Stats> オブジェクトがソケットを表す場合に true を返します。

stats.isSymbolicLink()#

<fs.Stats> オブジェクトがシンボリックリンクを表す場合に true を返します。

このメソッドは、fs.lstat() を使用する場合にのみ有効です。

stats.dev#

ファイルを含むデバイスの数値識別子。

stats.ino#

ファイルのファイルシステム固有の「Inode」番号。

stats.mode#

ファイルの種類とモードを記述するビットフィールドです。

stats.nlink#

ファイルに存在するハードリンクの数です。

stats.uid#

ファイルを所有するユーザーの数値ユーザー識別子 (POSIX) です。

stats.gid#

ファイルを所有するグループの数値グループ識別子 (POSIX) です。

stats.rdev#

ファイルがデバイスを表す場合の数値デバイス識別子です。

stats.size#

ファイルのサイズ (バイト単位) です。

基盤となるファイルシステムがファイルのサイズ取得をサポートしていない場合、これは 0 になります。

stats.blksize#

i/o 操作におけるファイルシステムのブロックサイズです。

stats.blocks#

このファイルに割り当てられたブロック数です。

stats.atimeMs#

このファイルが最後にアクセスされた時刻を示すタイムスタンプで、POSIX エポックからのミリ秒単位で表されます。

stats.mtimeMs#

このファイルが最後に変更された時刻を示すタイムスタンプで、POSIX エポックからのミリ秒単位で表されます。

stats.ctimeMs#

ファイルステータスが最後に変更された時刻を示すタイムスタンプで、POSIX エポックからのミリ秒単位で表されます。

stats.birthtimeMs#

このファイルの作成時刻を示すタイムスタンプで、POSIX エポックからのミリ秒単位で表されます。

stats.atimeNs#

オブジェクトを生成するメソッドに bigint: true が渡された場合にのみ存在します。このファイルが最後にアクセスされた時刻を示すタイムスタンプで、POSIX エポックからのナノ秒単位で表されます。

stats.mtimeNs#

オブジェクトを生成するメソッドに bigint: true が渡された場合にのみ存在します。このファイルが最後に変更された時刻を示すタイムスタンプで、POSIX エポックからのナノ秒単位で表されます。

stats.ctimeNs#

オブジェクトを生成するメソッドに bigint: true が渡された場合にのみ存在します。ファイルステータスが最後に変更された時刻を示すタイムスタンプで、POSIX エポックからのナノ秒単位で表されます。

stats.birthtimeNs#

オブジェクトを生成するメソッドに bigint: true が渡された場合にのみ存在します。このファイルの作成時刻を示すタイムスタンプで、POSIX エポックからのナノ秒単位で表されます。

stats.atime#

このファイルが最後にアクセスされた時刻を示すタイムスタンプです。

stats.mtime#

このファイルが最後に変更された時刻を示すタイムスタンプです。

stats.ctime#

ファイルステータスが最後に変更された時刻を示すタイムスタンプです。

stats.birthtime#

このファイルの作成時刻を示すタイムスタンプです。

Stat 時間の値#

atimeMsmtimeMsctimeMsbirthtimeMs プロパティは、対応する時間をミリ秒単位で保持する数値です。その精度はプラットフォーム固有です。オブジェクトを生成するメソッドに bigint: true が渡されると、プロパティはbigintになり、それ以外の場合はnumbersになります。

atimeNsmtimeNsctimeNsbirthtimeNs プロパティは、対応する時間をナノ秒単位で保持するbigintです。これらは、オブジェクトを生成するメソッドに bigint: true が渡された場合にのみ存在します。その精度はプラットフォーム固有です。

atimemtimectimebirthtime は、さまざまな時刻のDateオブジェクトによる代替表現です。Dateと数値は関連付けられていません。新しい数値を割り当てたり、Date値を変更したりしても、対応する代替表現には反映されません。

stat オブジェクト内の時刻には、次の意味があります

  • atime "アクセス時間": ファイルデータが最後にアクセスされた時刻。mknod(2)utimes(2)read(2)システムコールによって変更されます。
  • mtime "変更時間": ファイルデータが最後に変更された時刻。mknod(2)utimes(2)write(2)システムコールによって変更されます。
  • ctime "変更時間": ファイルステータスが最後に変更された時刻 (inode データ変更)。chmod(2)chown(2)link(2)mknod(2)rename(2)unlink(2)utimes(2)read(2)write(2)システムコールによって変更されます。
  • birthtime "作成時間": ファイルの作成時間。ファイルが作成されるときに 1 回設定されます。作成時間が利用できないファイルシステムでは、このフィールドには、ctime または 1970-01-01T00:00Z (つまり、Unix エポックタイムスタンプ 0) が保持される場合があります。この場合、この値は atime または mtime より大きくなる可能性があります。Darwin およびその他の FreeBSD バリアントでは、utimes(2) システムコールを使用して atime が現在の birthtime より前の値に明示的に設定された場合にも設定されます。

Node.js 0.12 より前では、ctime は Windows システムで birthtime を保持していました。0.12 以降、ctime は「作成時間」ではなくなり、Unix システムでは最初からそうではありませんでした。

クラス: fs.StatFs#

マウントされたファイルシステムに関する情報を提供します。

fs.statfs() およびその同期対応物から返されるオブジェクトは、この型です。これらのメソッドに渡される optionsbiginttrue の場合、数値は number ではなく bigint になります。

StatFs {
  type: 1397114950,
  bsize: 4096,
  blocks: 121938943,
  bfree: 61058895,
  bavail: 61058895,
  files: 999,
  ffree: 1000000
} 

bigint バージョン

StatFs {
  type: 1397114950n,
  bsize: 4096n,
  blocks: 121938943n,
  bfree: 61058895n,
  bavail: 61058895n,
  files: 999n,
  ffree: 1000000n
} 
statfs.bavail#

特権のないユーザーが使用できる空きブロックです。

statfs.bfree#

ファイルシステム内の空きブロックです。

statfs.blocks#

ファイルシステム内の合計データブロック数です。

statfs.bsize#

最適な転送ブロックサイズです。

statfs.ffree#

ファイルシステム内の空きファイルノードです。

statfs.files#

ファイルシステム内の合計ファイルノード数です。

statfs.type#

ファイルシステムの種類です。

クラス: fs.WriteStream#

<fs.WriteStream> のインスタンスは、fs.createWriteStream() 関数を使用して作成および返されます。

イベント: 'close'#

<fs.WriteStream> の基になるファイル記述子が閉じられたときに発行されます。

イベント: 'open'#

<fs.WriteStream> のファイルが開かれたときに発行されます。

イベント: 'ready'#

<fs.WriteStream> が使用できる状態になったときに発行されます。

'open' の直後に発生します。

writeStream.bytesWritten#

これまでに書き込まれたバイト数です。書き込みのためにキューに登録されているデータは含まれません。

writeStream.close([callback])#

writeStream を閉じます。オプションで、writeStream が閉じられた後に実行されるコールバックを受け取ります。

writeStream.path#

fs.createWriteStream()の最初の引数で指定された、ストリームが書き込んでいるファイルへのパスです。path が文字列として渡された場合、writeStream.path は文字列になります。path<Buffer> として渡された場合、writeStream.path<Buffer> になります。

writeStream.pending#

基になるファイルがまだ開かれていない場合、つまり 'ready' イベントが発生する前の場合、このプロパティは true です。

fs.constants#

ファイルシステム操作で一般的に使用される定数を含むオブジェクトを返します。

FS 定数#

以下の定数は、fs.constants および fsPromises.constants によってエクスポートされます。

すべての定数がすべてのオペレーティングシステムで利用できるわけではありません。特に、POSIX固有の定義の多くが利用できないWindowsでは重要です。移植性のあるアプリケーションの場合、使用前にそれらの存在を確認することをお勧めします。

複数の定数を使用するには、ビット単位の OR 演算子 | を使用します。

import { open, constants } from 'node:fs';

const {
  O_RDWR,
  O_CREAT,
  O_EXCL,
} = constants;

open('/path/to/my/file', O_RDWR | O_CREAT | O_EXCL, (err, fd) => {
  // ...
}); 
ファイルアクセス定数#

以下の定数は、fsPromises.access()fs.access()、および fs.accessSync() に渡される mode パラメーターとして使用することを目的としています。

定数 説明
F_OK ファイルが呼び出し元プロセスに表示されることを示すフラグ。これは、ファイルが存在するかどうかを判断するのに役立ちますが、rwx パーミッションについては何も示しません。モードが指定されていない場合のデフォルトです。
R_OK ファイルが呼び出し元プロセスによって読み取り可能であることを示すフラグ。
W_OK ファイルが呼び出し元プロセスによって書き込み可能であることを示すフラグ。
X_OK ファイルが呼び出し元プロセスによって実行可能であることを示すフラグ。これはWindowsでは効果がありません (fs.constants.F_OK のように動作します)。

定義はWindowsでも利用できます。

ファイルコピー定数#

以下の定数は、fs.copyFile() で使用することを目的としています。

定数 説明
COPYFILE_EXCL 存在する場合、コピー先のパスがすでに存在する場合、コピー操作はエラーで失敗します。
COPYFILE_FICLONE 存在する場合、コピー操作はコピーオンライトの reflink を作成しようとします。基盤となるプラットフォームがコピーオンライトをサポートしていない場合、フォールバックのコピーメカニズムが使用されます。
COPYFILE_FICLONE_FORCE 存在する場合、コピー操作はコピーオンライトの reflink を作成しようとします。基盤となるプラットフォームがコピーオンライトをサポートしていない場合、操作はエラーで失敗します。

定義はWindowsでも利用できます。

ファイルオープン定数#

以下の定数は、fs.open() で使用することを目的としています。

定数 説明
O_RDONLY ファイルを読み取り専用アクセスで開くことを示すフラグ。
O_WRONLY ファイルを書き込み専用アクセスで開くことを示すフラグ。
O_RDWR ファイルを読み取り/書き込みアクセスで開くことを示すフラグ。
O_CREAT ファイルがまだ存在しない場合はファイルを作成することを示すフラグ。
O_EXCL O_CREAT フラグが設定され、ファイルがすでに存在する場合、ファイルを開く操作が失敗する必要があることを示すフラグ。
O_NOCTTY パスがターミナルデバイスを識別する場合、パスを開くことで、プロセスが (まだ持っていない場合) そのターミナルをプロセスの制御端末にしないことを示すフラグ。
O_TRUNC ファイルが存在し、通常のファイルであり、書き込みアクセスでファイルが正常に開かれた場合、その長さがゼロに切り詰められることを示すフラグ。
O_APPEND データがファイルの最後に追加されることを示すフラグ。
O_DIRECTORY パスがディレクトリでない場合、open が失敗する必要があることを示すフラグ。
O_NOATIME ファイルシステムへの読み取りアクセスによって、ファイルに関連付けられた atime 情報が更新されなくなることを示すフラグ。このフラグは Linux オペレーティングシステムでのみ使用できます。
O_NOFOLLOW パスがシンボリックリンクの場合、open が失敗する必要があることを示すフラグ。
O_SYNC ファイルが、ファイルの整合性を待機する書き込み操作で同期 I/O 用に開かれることを示すフラグ。
O_DSYNC ファイルが、データの整合性を待機する書き込み操作で同期 I/O 用に開かれることを示すフラグ。
O_SYMLINK シンボリックリンクが指しているリソースではなく、シンボリックリンク自体を開くことを示すフラグ。
O_DIRECT 設定すると、ファイルI/Oのキャッシュ効果を最小限に抑える試みが行われます。
O_NONBLOCK 可能な場合、ファイルを非ブロッキングモードで開くことを示すフラグ。
UV_FS_O_FILEMAP 設定すると、ファイルにアクセスするためにメモリファイルマッピングが使用されます。このフラグは Windows オペレーティングシステムでのみ使用できます。他のオペレーティングシステムでは、このフラグは無視されます。

Windowsでは、O_APPENDO_CREATO_EXCLO_RDONLYO_RDWRO_TRUNCO_WRONLY、および UV_FS_O_FILEMAP のみが使用可能です。

ファイルタイプ定数#

以下の定数は、ファイルのタイプを判別するために、<fs.Stats>オブジェクトの mode プロパティで使用することを目的としています。

定数 説明
S_IFMT ファイルタイプコードを抽出するために使用されるビットマスク。
S_IFREG 通常のファイルのファイルタイプ定数。
S_IFDIR ディレクトリのファイルタイプ定数。
S_IFCHR 文字指向のデバイスファイルのファイルタイプ定数。
S_IFBLK ブロック指向のデバイスファイルのファイルタイプ定数。
S_IFIFO FIFO/パイプのファイルタイプ定数。
S_IFLNK シンボリックリンクのファイルタイプ定数。
S_IFSOCK ソケットのファイルタイプ定数。

Windowsでは、S_IFCHRS_IFDIRS_IFLNKS_IFMT、および S_IFREG のみが利用可能です。

ファイルモード定数#

以下の定数は、ファイルのアクセス許可を判別するために、<fs.Stats>オブジェクトの mode プロパティで使用することを目的としています。

定数 説明
S_IRWXU 所有者による読み取り、書き込み、実行可能を示すファイルモード。
S_IRUSR 所有者による読み取り可能を示すファイルモード。
S_IWUSR 所有者による書き込み可能を示すファイルモード。
S_IXUSR 所有者による実行可能を示すファイルモード。
S_IRWXG グループによる読み取り、書き込み、実行可能を示すファイルモード。
S_IRGRP グループによる読み取り可能を示すファイルモード。
S_IWGRP グループによる書き込み可能を示すファイルモード。
S_IXGRP グループによる実行可能を示すファイルモード。
S_IRWXO その他による読み取り、書き込み、実行可能を示すファイルモード。
S_IROTH その他による読み取り可能を示すファイルモード。
S_IWOTH その他による書き込み可能を示すファイルモード。
S_IXOTH その他による実行可能を示すファイルモード。

Windowsでは、S_IRUSRS_IWUSR のみが利用可能です。

注意点#

コールバックとPromiseベースの操作の順序付け#

コールバックまたはPromiseベースのメソッドのいずれかを使用する場合、基盤となるスレッドプールによって非同期的に実行されるため、保証された順序はありません。

たとえば、次の例はエラーが発生しやすい可能性があります。これは、fs.stat() 操作が fs.rename() 操作よりも前に完了する可能性があるためです。

const fs = require('node:fs');

fs.rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  console.log('renamed complete');
});
fs.stat('/tmp/world', (err, stats) => {
  if (err) throw err;
  console.log(`stats: ${JSON.stringify(stats)}`);
}); 

一方を呼び出す前に、一方の結果を待機することで、操作を正しく順序付けることが重要です。

import { rename, stat } from 'node:fs/promises';

const oldPath = '/tmp/hello';
const newPath = '/tmp/world';

try {
  await rename(oldPath, newPath);
  const stats = await stat(newPath);
  console.log(`stats: ${JSON.stringify(stats)}`);
} catch (error) {
  console.error('there was an error:', error.message);
}const { rename, stat } = require('node:fs/promises');

(async function(oldPath, newPath) {
  try {
    await rename(oldPath, newPath);
    const stats = await stat(newPath);
    console.log(`stats: ${JSON.stringify(stats)}`);
  } catch (error) {
    console.error('there was an error:', error.message);
  }
})('/tmp/hello', '/tmp/world');

または、コールバック API を使用する場合、fs.stat() の呼び出しを fs.rename() 操作のコールバックに移動します。

import { rename, stat } from 'node:fs';

rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`stats: ${JSON.stringify(stats)}`);
  });
});const { rename, stat } = require('node:fs/promises');

rename('/tmp/hello', '/tmp/world', (err) => {
  if (err) throw err;
  stat('/tmp/world', (err, stats) => {
    if (err) throw err;
    console.log(`stats: ${JSON.stringify(stats)}`);
  });
});

ファイルパス#

ほとんどの fs 操作は、文字列、<Buffer>、または file: プロトコルを使用した <URL> オブジェクトの形式で指定できるファイルパスを受け入れます。

文字列パス#

文字列パスは、絶対または相対ファイル名を識別する UTF-8 文字シーケンスとして解釈されます。相対パスは、process.cwd() を呼び出すことによって決定される現在の作業ディレクトリを基準に解決されます。

POSIX での絶対パスの使用例

import { open } from 'node:fs/promises';

let fd;
try {
  fd = await open('/open/some/file.txt', 'r');
  // Do something with the file
} finally {
  await fd?.close();
} 

POSIX での相対パスの使用例 (process.cwd() を基準)

import { open } from 'node:fs/promises';

let fd;
try {
  fd = await open('file.txt', 'r');
  // Do something with the file
} finally {
  await fd?.close();
} 
ファイルURLパス#

ほとんどの node:fs モジュール関数では、path または filename 引数を、file: プロトコルを使用した <URL> オブジェクトとして渡すことができます。

import { readFileSync } from 'node:fs';

readFileSync(new URL('file:///tmp/hello')); 

file: URLは常に絶対パスです。

プラットフォーム固有の考慮事項#

Windowsでは、ホスト名を持つ file: <URL> は UNC パスに変換され、ドライブ文字を持つ file: <URL> はローカルの絶対パスに変換されます。ホスト名がなく、ドライブ文字がない file: <URL> はエラーになります

import { readFileSync } from 'node:fs';
// On Windows :

// - WHATWG file URLs with hostname convert to UNC path
// file://hostname/p/a/t/h/file => \\hostname\p\a\t\h\file
readFileSync(new URL('file://hostname/p/a/t/h/file'));

// - WHATWG file URLs with drive letters convert to absolute path
// file:///C:/tmp/hello => C:\tmp\hello
readFileSync(new URL('file:///C:/tmp/hello'));

// - WHATWG file URLs without hostname must have a drive letters
readFileSync(new URL('file:///notdriveletter/p/a/t/h/file'));
readFileSync(new URL('file:///c/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must be absolute 

ドライブ文字を持つ file: <URL> は、ドライブ文字の直後に区切り文字として : を使用する必要があります。別の区切り文字を使用するとエラーになります。

他のすべてのプラットフォームでは、ホスト名を持つ file: <URL> はサポートされておらず、エラーになります

import { readFileSync } from 'node:fs';
// On other platforms:

// - WHATWG file URLs with hostname are unsupported
// file://hostname/p/a/t/h/file => throw!
readFileSync(new URL('file://hostname/p/a/t/h/file'));
// TypeError [ERR_INVALID_FILE_URL_PATH]: must be absolute

// - WHATWG file URLs convert to absolute path
// file:///tmp/hello => /tmp/hello
readFileSync(new URL('file:///tmp/hello')); 

エンコードされたスラッシュ文字を持つ file: <URL> は、すべてのプラットフォームでエラーになります

import { readFileSync } from 'node:fs';

// On Windows
readFileSync(new URL('file:///C:/p/a/t/h/%2F'));
readFileSync(new URL('file:///C:/p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
\ or / characters */

// On POSIX
readFileSync(new URL('file:///p/a/t/h/%2F'));
readFileSync(new URL('file:///p/a/t/h/%2f'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
/ characters */ 

Windowsでは、エンコードされたバックスラッシュを持つ file: <URL> はエラーになります

import { readFileSync } from 'node:fs';

// On Windows
readFileSync(new URL('file:///C:/path/%5C'));
readFileSync(new URL('file:///C:/path/%5c'));
/* TypeError [ERR_INVALID_FILE_URL_PATH]: File URL path must not include encoded
\ or / characters */ 
Buffer パス#

<Buffer> を使用して指定されたパスは、主にファイルパスを不透明なバイトシーケンスとして扱う特定の POSIX オペレーティングシステムで役立ちます。このようなシステムでは、1つのファイルパスに複数の文字エンコーディングを使用するサブシーケンスを含めることができます。文字列パスと同様に、<Buffer> パスは相対パスまたは絶対パスの場合があります。

POSIX での絶対パスの使用例

import { open } from 'node:fs/promises';
import { Buffer } from 'node:buffer';

let fd;
try {
  fd = await open(Buffer.from('/open/some/file.txt'), 'r');
  // Do something with the file
} finally {
  await fd?.close();
} 
Windowsでのドライブごとの作業ディレクトリ#

Windowsでは、Node.jsはドライブごとのワーキングディレクトリという概念に従います。この挙動は、バックスラッシュなしでドライブパスを使用した場合に確認できます。たとえば、fs.readdirSync('C:\\') は、fs.readdirSync('C:') とは異なる結果を返す可能性があります。詳細については、このMSDNページを参照してください。

ファイル記述子#

POSIXシステムでは、すべてのプロセスに対して、カーネルは現在開いているファイルとリソースのテーブルを保持しています。開いている各ファイルには、ファイル記述子と呼ばれる単純な数値識別子が割り当てられます。システムレベルでは、すべてのファイルシステム操作は、これらのファイル記述子を使用して、特定の各ファイルを識別および追跡します。Windowsシステムでは、リソースを追跡するための概念的には類似した別のメカニズムを使用します。ユーザーのために簡略化するため、Node.jsはオペレーティングシステム間の違いを抽象化し、開いているすべてのファイルに数値ファイル記述子を割り当てます。

コールバックベースの fs.open() および同期の fs.openSync() メソッドは、ファイルを開き、新しいファイル記述子を割り当てます。割り当てられると、ファイル記述子を使用して、ファイルからのデータの読み取り、ファイルへのデータの書き込み、またはファイルに関する情報の要求を行うことができます。

オペレーティングシステムは、任意の時点で開くことができるファイル記述子の数を制限しているため、操作が完了したら記述子を閉じることが重要です。そうしないと、最終的にアプリケーションがクラッシュするメモリリークが発生します。

import { open, close, fstat } from 'node:fs';

function closeFd(fd) {
  close(fd, (err) => {
    if (err) throw err;
  });
}

open('/open/some/file.txt', 'r', (err, fd) => {
  if (err) throw err;
  try {
    fstat(fd, (err, stat) => {
      if (err) {
        closeFd(fd);
        throw err;
      }

      // use stat

      closeFd(fd);
    });
  } catch (err) {
    closeFd(fd);
    throw err;
  }
}); 

PromiseベースのAPIは、数値ファイル記述子の代わりに <FileHandle> オブジェクトを使用します。これらのオブジェクトは、リソースがリークしないようにシステムによってより適切に管理されます。ただし、操作が完了したらそれらを閉じる必要は依然としてあります。

import { open } from 'node:fs/promises';

let file;
try {
  file = await open('/open/some/file.txt', 'r');
  const stat = await file.stat();
  // use stat
} finally {
  await file.close();
} 

スレッドプールの使用#

すべてのコールバックおよびPromiseベースのファイルシステムAPI (fs.FSWatcher() を除く) は、libuvのスレッドプールを使用します。これは、一部のアプリケーションで驚くほど否定的なパフォーマンスへの影響をもたらす可能性があります。詳細については、UV_THREADPOOL_SIZE のドキュメントを参照してください。

ファイルシステムのフラグ#

flag オプションが文字列を受け取る場所では、以下のフラグが利用可能です。

  • 'a': ファイルを追記用に開きます。ファイルが存在しない場合は作成されます。

  • 'ax': 'a' に似ていますが、パスが存在する場合は失敗します。

  • 'a+': ファイルを読み取りと追記用に開きます。ファイルが存在しない場合は作成されます。

  • 'ax+': 'a+' に似ていますが、パスが存在する場合は失敗します。

  • 'as': ファイルを同期モードで追記用に開きます。ファイルが存在しない場合は作成されます。

  • 'as+': ファイルを同期モードで読み取りと追記用に開きます。ファイルが存在しない場合は作成されます。

  • 'r': ファイルを読み取り用に開きます。ファイルが存在しない場合は例外が発生します。

  • 'rs': ファイルを同期モードで読み取り用に開きます。ファイルが存在しない場合は例外が発生します。

  • 'r+': ファイルを読み取りと書き込み用に開きます。ファイルが存在しない場合は例外が発生します。

  • 'rs+': ファイルを同期モードで読み取りと書き込み用に開きます。ローカルファイルシステムキャッシュをバイパスするようにオペレーティングシステムに指示します。

    これは主にNFSマウント上のファイルを開く場合に役立ち、場合によっては古いローカルキャッシュをスキップできます。I/Oパフォーマンスに非常に大きな影響があるため、このフラグが必要な場合を除き、使用はお勧めしません。

    これにより、fs.open() または fsPromises.open() が同期ブロッキングコールになるわけではありません。同期操作が必要な場合は、fs.openSync() のようなものを使用する必要があります。

  • 'w': ファイルを書き込み用に開きます。ファイルは(存在しない場合は)作成されるか、(存在する場合は)切り捨てられます。

  • 'wx': 'w' に似ていますが、パスが存在する場合は失敗します。

  • 'w+': ファイルを読み取りと書き込み用に開きます。ファイルは(存在しない場合は)作成されるか、(存在する場合は)切り捨てられます。

  • 'wx+': 'w+' に似ていますが、パスが存在する場合は失敗します。

flag は、open(2) でドキュメント化されているように、数値にすることもできます。一般的に使用される定数は fs.constants から利用できます。Windowsでは、フラグは該当する場合、同等のものに変換されます。たとえば、O_WRONLYFILE_GENERIC_WRITE に、または O_EXCL|O_CREATCreateFileW で受け入れられる CREATE_NEW に変換されます。

排他フラグ 'x' (open(2)O_EXCL フラグ) は、パスが既に存在する場合、操作がエラーを返すようにします。POSIXでは、パスがシンボリックリンクの場合、O_EXCL を使用すると、リンクが存在しないパスを指している場合でもエラーが返されます。排他フラグは、ネットワークファイルシステムでは機能しない場合があります。

Linux では、ファイルが追加モードで開かれている場合、位置指定書き込みは機能しません。カーネルは position 引数を無視し、常にデータの末尾に追加します。

ファイルを置き換えるのではなく変更するには、flag オプションをデフォルトの 'w' ではなく 'r+' に設定する必要がある場合があります。

一部のフラグの動作はプラットフォーム固有です。そのため、以下の例のように、macOSとLinuxで 'a+' フラグを使用してディレクトリを開くとエラーが返されます。対照的に、WindowsおよびFreeBSDでは、ファイル記述子または FileHandle が返されます。

// macOS and Linux
fs.open('<directory>', 'a+', (err, fd) => {
  // => [Error: EISDIR: illegal operation on a directory, open <directory>]
});

// Windows and FreeBSD
fs.open('<directory>', 'a+', (err, fd) => {
  // => null, <fd>
}); 

Windowsでは、'w' フラグを使用して既存の隠しファイルを開く(fs.open()fs.writeFile()、または fsPromises.open() のいずれかを介して)と、EPERM で失敗します。既存の隠しファイルは、'r+' フラグを使用して書き込み用に開くことができます。

fs.ftruncate() または filehandle.truncate() への呼び出しを使用して、ファイルの内容をリセットできます。