ファイルシステム#

安定性: 2 - Stable

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

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

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

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

コールバック API と同期 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');
});

最大のパフォーマンス (実行時間とメモリ割り当ての両方の観点から) が要求される場合、node:fs モジュール API のコールバックベースのバージョンは、Promise 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'#

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

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])#

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 には、ファイルの先頭を越えた任意の位置にデータを書き込むことを許可する start オプションも含めることができます。許可される値は [0, Number.MAX_SAFE_INTEGER] の範囲です。ファイルを置き換えるのではなく変更する場合、flagsopen オプションをデフォルトの r ではなく 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#
  • 型: <number> <FileHandle> オブジェクトによって管理される数値のファイル記述子。
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])#

ファイルの内容を読み取るために使用できるバイト指向の 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 を自動的に閉じることはありません。autoClose オプションが true に設定されていない限り、ユーザーコードは 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 では、ファイルが追記モードで開かれている場合、位置指定書き込みは機能しません。カーネルは位置引数を無視し、常にデータをファイルの末尾に追記します。

filehandle.write(buffer[, options])#

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

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

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

string をファイルに書き込みます。string が文字列でない場合、promise はエラーで拒否されます。

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

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

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

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

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 <integer> | <null> ファイルの先頭からのオフセットで、buffers からのデータを書き込むべき場所。positionnumber でない場合、データは現在の位置に書き込まれます。デフォルト: null
  • 戻り値: <Promise>

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

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

promise が履行 (または拒否) されるのを待たずに、同じファイルに writev() を複数回呼び出すのは安全ではありません。

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

filehandle[Symbol.asyncDispose]()#

filehandle.close() を呼び出し、ファイルハンドルが閉じられたときに履行される promise を返します。

fsPromises.access(path[, mode])#

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

アクセシビリティチェックが成功した場合、promise は値なしで履行されます。アクセシビリティチェックのいずれかが失敗した場合、promise は <Error> オブジェクトで拒否されます。次の例では、ファイル /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 は、追記用に開かれた <FileHandle> (fsPromises.open() を使用) として指定できます。

fsPromises.chmod(path, mode)#

ファイルのパーミッションを変更します。

fsPromises.chown(path, uid, gid)#

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

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

  • src <string> | <Buffer> | <URL> コピー元のファイル名
  • dest <string> | <Buffer> | <URL> コピー操作のコピー先のファイル名
  • mode <integer> コピー操作の動作を指定するオプションの修飾子。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])#

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

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

ディレクトリを別のディレクトリにコピーする場合、グロブはサポートされず、動作は cp dir1/ dir2/ に似ています。

fsPromises.glob(pattern[, options])#

  • pattern <string> | <string[]>
  • options <Object>
    • cwd <string> | <URL> 現在の作業ディレクトリ。デフォルト: process.cwd()
    • exclude <Function> | <string[]> ファイル/ディレクトリを除外するための関数、または除外するグロブパターンのリスト。関数が提供された場合、アイテムを除外するには true を、含めるには false を返します。デフォルト: undefined。文字列配列が提供された場合、各文字列は除外するパスを指定するグロブパターンである必要があります。注意: 否定パターン (例: '!foo.js') はサポートされていません。
    • withFileTypes <boolean> グロブがパスを Dirent として返す場合は true、それ以外は falseデフォルト: false
  • 戻り値: <AsyncIterator> パターンに一致するファイルのパスを生成する AsyncIterator。
import { glob } from 'node:fs/promises';

for await (const entry of glob('**/*.js'))
  console.log(entry);const { glob } = require('node:fs/promises');

(async () => {
  for await (const entry of glob('**/*.js'))
    console.log(entry);
})();

fsPromises.lchmod(path, mode)#

安定性: 0 - 非推奨

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

このメソッドは 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 <string> | <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.mkdtempDisposable(prefix[, options])#

結果の Promise は、path プロパティが作成されたディレクトリパスを保持する非同期破棄可能オブジェクトを保持します。オブジェクトが破棄されると、ディレクトリとその内容がまだ存在する場合、非同期に削除されます。ディレクトリが削除できない場合、破棄はエラーをスローします。オブジェクトには、同じタスクを実行する非同期の remove() メソッドがあります。

この関数と結果のオブジェクトの破棄関数の両方が非同期であるため、await using dir = await fsPromises.mkdtempDisposable('prefix') のように await + await using と一緒に使用する必要があります。

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

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

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

<FileHandle> を開きます。

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

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

fsPromises.opendir(path[, options])#

  • path <string> | <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 <string> | <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 はエラーで reject されます。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 で reject されます。

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 で fulfill されます。

オプションの 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)#

oldPath の名前を newPath に変更します。

fsPromises.rmdir(path[, options])#

  • path <string> | <Buffer> | <URL>
  • options <Object> 現在公開されているオプションはありません。以前は recursivemaxBusyTriesemfileWait のオプションがありましたが、それらは非推奨となり削除されました。options 引数は後方互換性のためにまだ受け入れられていますが、使用されません。
  • 戻り値: <Promise> 成功すると undefined で履行されます。

path で指定されたディレクトリを削除します。

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

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

fsPromises.rm(path[, options])#

  • path <string> | <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 引数が null の場合、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 が参照するオブジェクトのファイルシステムタイムスタンプを変更します。

atimemtime 引数は以下のルールに従います

  • 値は、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>
    • maxQueue <number> 返される <AsyncIterator> のイテレーション間でキューに入れるイベントの数を指定します。 デフォルト: 2048
    • overflow <string> maxQueue が許可するよりも多くのイベントをキューに入れようとした場合の動作で、'ignore' または 'throw' のいずれかです。'ignore' はオーバーフローしたイベントが破棄され警告が出力されることを意味し、'throw' は例外をスローすることを意味します。 デフォルト: 'ignore'
  • 戻り値: <AsyncIterator> 以下のプロパティを持つオブジェクトの非同期イテレータ

filename の変更を監視する非同期イテレータを返します。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> は書き込みをサポートしている必要があります。

promise が確定するのを待たずに同じファイルに対して 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_OKfs.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.open()fs.readFile()、または fs.writeFile() を呼び出す前にファイルのアクセシビリティを確認するために fs.access() を使用しないでください。そうすると、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)#

非同期に srcdest にコピーします。デフォルトでは、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)#

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

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

ディレクトリを別のディレクトリにコピーする場合、グロブはサポートされず、動作は cp dir1/ dir2/ に似ています。

fs.createReadStream(path[, options])#

options には、ファイル全体ではなくファイルのバイト範囲を読み取るための startend の値を含めることができます。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 オプションを提供することで、対応する openreadclosefs 実装をオーバーライドすることが可能です。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 オプションを提供することで、対応する openwritewritevclosefs 実装をオーバーライドすることが可能です。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() を使用してください。

ファイルシステムでチェックすることにより、指定された path の要素が存在するかどうかをテストします。その後、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つです。

path がシンボリックリンクの場合、それはたどられます。したがって、path が存在しても存在しない要素を指している場合、コールバックは値 false を受け取ります。

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.glob(pattern[, options], callback)#

  • pattern <string> | <string[]>

  • options <Object>

    • cwd <string> | <URL> 現在の作業ディレクトリ。デフォルト: process.cwd()
    • exclude <Function> | <string[]> ファイル/ディレクトリを除外するための関数、または除外するグロブパターンのリスト。関数が提供された場合、項目を除外するには true を、含めるには false を返します。 デフォルト: undefined
    • withFileTypes <boolean> グロブがパスを Dirent として返す場合は true、それ以外は falseデフォルト: false
  • callback <Function>

  • 指定されたパターンに一致するファイルを取得します。

import { glob } from 'node:fs';

glob('**/*.js', (err, matches) => {
  if (err) throw err;
  console.log(matches);
});const { glob } = require('node:fs');

glob('**/*.js', (err, matches) => {
  if (err) throw err;
  console.log(matches);
});

fs.lchmod(path, mode, callback)#

安定性: 0 - 非推奨

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

このメソッドは 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(パーミッションとスティッキービット)を指定する整数、または親ディレクトリを作成すべきかどうかを示す recursive プロパティと mode プロパティを持つオブジェクトにすることができます。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])#

指定されたファイルによってデータがバックアップされる <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 <string> | <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 <integer>
  • 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() されたバージョンとして呼び出された場合、bytesReadbuffer プロパティを持つ Object の promise を返します。

fs.read() メソッドは、ファイル記述子(fd)で指定されたファイルからデータを読み取ります。length 引数は、Node.js がカーネルから読み取ろうとする最大バイト数を示します。しかし、実際に読み取られるバイト数(bytesRead)は、さまざまな理由で指定された length よりも少なくなることがあります。

例:

  • ファイルが指定された length より短い場合、bytesRead は実際に読み取られたバイト数に設定されます。
  • バッファが埋まる前にファイルが EOF(End of File)に達した場合、Node.js は EOF に達するまで利用可能なすべてのバイトを読み取り、コールバックの bytesRead パラメータは実際に読み取られたバイト数を示し、これは指定された length より少ない場合があります。
  • ファイルが低速なネットワーク filesystem 上にあるか、読み取り中に他の問題が発生した場合、bytesRead は指定された length よりも少なくなることがあります。

したがって、fs.read() を使用する場合、bytesRead の値をチェックして、ファイルから実際に何バイト読み取られたかを確認することが重要です。アプリケーションのロジックによっては、最小限のバイト数が必要な場合は読み取り呼び出しをループでラップするなど、bytesRead が指定された length よりも少ない場合のケースを処理する必要があるかもしれません。

この動作は POSIX の preadv2 関数に似ています。

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

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

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

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

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

ディレクトリの内容を読み取ります。コールバックは2つの引数 (err, files) を受け取ります。ここで 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 が実際のファイルサイズを判断できない場合、各読み取り操作は 64 KiB のデータをロードします。通常のファイルの場合、各読み取りは 512 KiB のデータを処理します。

ファイルの内容をできるだけ速く読み取る必要があるアプリケーションの場合、fs.read() を直接使用し、アプリケーションコードがファイル全体の読み取りを管理する方が良いです。

Node.js の GitHub issue #25741 は、異なる Node.js バージョンにおける複数のファイルサイズに対する fs.readFile() のパフォーマンスに関する詳細な情報と分析を提供しています。

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

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

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

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

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

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

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

コールバックには3つの引数が渡されます: errbytesReadbuffersbytesRead はファイルから読み取られたバイト数です。

このメソッドが 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 がソケットまたはパイプに解決される場合、この関数はそのオブジェクトのシステム依存の名前を返します。

存在しないパスは ENOENT エラーになります。error.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 <string> | <Buffer> | <URL>
  • options <Object> 現在公開されているオプションはありません。以前は recursivemaxBusyTriesemfileWait のオプションがありましたが、それらは非推奨となり削除されました。options 引数は後方互換性のためにまだ受け入れられていますが、使用されません。
  • callback <Function>

非同期の rmdir(2) です。完了コールバックには、考えられる例外以外の引数は与えられません。

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

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

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

  • path <string> | <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.code共通システムエラー のいずれかになります。

fs.stat() はシンボリックリンクをたどります。リンク自体を調べるには fs.lstat() を使用してください。

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

ファイルを操作せずにその存在を確認するには、fs.access() が推奨されます。

例えば、以下のディレクトリ構造があるとします。

- txtDir
-- file.txt
- app.js 

次のプログラムは、与えられたパスの stats をチェックします。

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.code共通システムエラー のいずれかになります。

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

target を指す path という名前のリンクを作成します。完了コールバックには、考えられる例外以外の引数は与えられません。

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

type 引数は Windows でのみ利用可能で、他のプラットフォームでは無視されます。'dir''file'、または 'junction' に設定できます。type 引数が null の場合、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 <string> | <Buffer> | <URL>
  • listener <Function> オプション。以前に fs.watchFile() を使ってアタッチされたリスナーです。

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

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

fs.watch() の使用は fs.watchFile()fs.unwatchFile() よりも効率的です。可能な場合は fs.watchFile()fs.unwatchFile() の代わりに fs.watch() を使用すべきです。

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

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

atimemtime 引数は以下のルールに従います

  • 値は、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 はオブジェクトとして渡されるべきです。

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

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

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

signal が渡された場合、対応する AbortController を中止すると、返された <fs.FSWatcher> がクローズされます。

注意点#

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

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

fs.watch API は、ファイルシステム上の悪意のあるアクションに対する保護を提供しません。例えば、Windows では、特定のファイルではなくディレクトリ内の変更を監視することによって実装されます。これにより、ファイルが置き換えられ、fs が同じファイル名を持つ新しいファイルの変更を報告することが可能になります。

利用可能性#

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

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

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

stat ポーリングを使用する fs.watchFile() を使用することはまだ可能ですが、この方法は遅く、信頼性が低いです。

inode#

Linux および macOS システムでは、fs.watch() はパスを inode に解決し、その inode を監視します。監視対象のパスが削除されて再作成されると、新しい inode が割り当てられます。監視は削除イベントを発行しますが、 の inode の監視を続けます。新しい inode のイベントは発行されません。これは期待される動作です。

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

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エポック)で呼び出されます。後でファイルが作成された場合、リスナーは最新のstatオブジェクトで再度呼び出されます。これは v0.10 からの機能変更です。

fs.watch() の使用は fs.watchFilefs.unwatchFile よりも効率的です。可能な場合は fs.watchFilefs.unwatchFile の代わりに fs.watch を使用すべきです。

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

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

  • ファイルが削除された後、復元される。
  • ファイルが名前変更され、その後、元の名前に再度名前変更される。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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' の場合、データは現在の位置に書き込まれます。

コールバックには errbytesWrittenbuffers の3つの引数が与えられます。bytesWrittenbuffers から書き込まれたバイト数です。

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

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

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

同期 API#

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

fs.accessSync(path[, mode])#

path で指定されたファイルまたはディレクトリに対するユーザーのパーミッションを同期的にテストします。mode 引数は、実行するアクセシビリティチェックを指定するオプションの整数です。mode は、値 fs.constants.F_OK または fs.constants.R_OKfs.constants.W_OKfs.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])#

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

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

ディレクトリを別のディレクトリにコピーする場合、グロブはサポートされず、動作は 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 <integer>
  • 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.globSync(pattern[, options])#

  • pattern <string> | <string[]>
  • options <Object>
    • cwd <string> | <URL> 現在の作業ディレクトリ。デフォルト: process.cwd()
    • exclude <Function> | <string[]> ファイル/ディレクトリを除外するための関数、または除外するグロブパターンのリスト。関数が提供された場合、項目を除外するには true を、含めるには false を返します。 デフォルト: undefined
    • withFileTypes <boolean> グロブがパスを Dirent として返す場合は true、それ以外は falseデフォルト: false
  • 戻り値: <string[]> パターンに一致するファイルのパス。
import { globSync } from 'node:fs';

console.log(globSync('**/*.js'));const { globSync } = require('node:fs');

console.log(globSync('**/*.js'));

fs.lchmodSync(path, mode)#

安定性: 0 - 非推奨

シンボリックリンクのパーミッションを変更します。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 <string> | <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.mkdtempDisposableSync(prefix[, options])#

path プロパティに作成されたディレクトリのパスを持つ使い捨てオブジェクトを返します。オブジェクトが破棄されると、ディレクトリとその内容がまだ存在する場合、削除されます。ディレクトリが削除できない場合、破棄はエラーをスローします。このオブジェクトには、同じタスクを実行する remove() メソッドがあります。

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

この API にはコールバックベースのバージョンはありません。なぜなら、これは using 構文で使用されるように設計されているからです。

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

fs.opendirSync(path[, options])#

  • path <string> | <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 <string> | <Buffer> | <URL>
  • options <Object> 現在公開されているオプションはありません。以前は recursivemaxBusyTriesemfileWait のオプションがありましたが、それらは非推奨となり削除されました。options 引数は後方互換性のためにまだ受け入れられていますが、使用されません。

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

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

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

fs.rmSync(path[, options])#

  • path <string> | <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 <string> | <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.code共通システムエラー のいずれかになります。

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

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

fs.truncateSync(path[, len])#

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

ファイルディスクリプタを渡すことは非推奨であり、将来的にエラーがスローされる可能性があります。

fs.unlinkSync(path)#

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

fs.utimesSync(path, atime, mtime)#

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

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

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> で解決される Promise が返されます。読み取るディレクトリエントリがこれ以上ない場合は null になります。

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

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> を参照してください。

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

dir[Symbol.asyncDispose]()#

ディレクトリハンドルが開いている場合、dir.close() を呼び出し、破棄が完了したときに解決される Promise を返します。

dir[Symbol.dispose]()#

ディレクトリハンドルが開いている場合、dir.closeSync() を呼び出し、undefined を返します。

クラス: 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> オブジェクトが first-in-first-out (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#

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

クラス: 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> オブジェクトは「参照」(ref'ed) されているため、以前に 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> オブジェクトは「参照」(ref'ed) されているため、以前に 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 で終わる追加のナノ秒精度のプロパティが含まれます。Stat オブジェクトは new キーワードを使用して直接作成するべきではありません。

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) パイプを記述している場合に 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になります。そうでなければnumberになります。

atimeNsmtimeNsctimeNsbirthtimeNs プロパティは、対応する時刻をナノ秒単位で保持する bigint です。これらは、オブジェクトを生成するメソッドに bigint: true が渡された場合にのみ存在します。その精度はプラットフォームによって異なります。

atime, mtime, ctime, birthtime は、様々な時刻の代替表現である Date オブジェクトです。Date と数値の値は関連していません。新しい数値を代入したり、Date の値を変更しても、対応する代替表現には反映されません。

stat オブジェクト内の時刻は、以下のセマンティクスを持ちます

  • atime "アクセス時刻 (Access Time)": ファイルデータが最後にアクセスされた時刻。mknod(2), utimes(2), read(2) システムコールによって変更されます。
  • mtime "変更時刻 (Modified Time)": ファイルデータが最後に変更された時刻。mknod(2), utimes(2), write(2) システムコールによって変更されます。
  • ctime "変更時刻 (Change Time)": ファイルステータスが最後に変更された時刻 (inode データの変更)。chmod(2), chown(2), link(2), mknod(2), rename(2), unlink(2), utimes(2), read(2), write(2) システムコールによって変更されます。
  • birthtime "生成時刻 (Birth Time)": ファイルの作成時刻。ファイルが作成されたときに一度だけ設定されます。birthtime が利用できないファイルシステムでは、このフィールドには ctime または 1970-01-01T00:00Z (つまり、Unix エポックのタイムスタンプ 0) のいずれかが保持されることがあります。この場合、この値は atimemtime よりも大きくなることがあります。Darwin やその他の FreeBSD 派生システムでは、utimes(2) システムコールを使用して atime が現在の birthtime よりも早い値に明示的に設定された場合にも設定されます。

Node.js 0.12 以前では、Windows システムでは ctimebirthtime を保持していました。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.Utf8Stream#

安定性: 1 - Experimental

内部バッファリングをすべてオンデマンドでフラッシュできる最適化された UTF-8 ストリームライターです。EAGAIN エラーを正しく処理し、例えばディスクがビジーな場合にコンテンツをドロップするなどのカスタマイズが可能です。

イベント: 'close'#

'close' イベントは、ストリームが完全にクローズされたときに発生します。

イベント: 'drain'#

'drain' イベントは、内部バッファが書き込みを継続できる程度に空になったときに発生します。

イベント: 'drop'#

'drop' イベントは、最大長に達し、データが書き込まれないときに発生します。ドロップされたデータは、イベントハンドラの最初の引数として渡されます。

イベント: 'error'#

'error' イベントは、エラーが発生したときに発生します。

イベント: 'finish'#

'finish' イベントは、ストリームが終了し、すべてのデータが基になるファイルにフラッシュされたときに発生します。

イベント: 'ready'#

'ready' イベントは、ストリームが書き込みを受け入れる準備ができたときに発生します。

イベント: 'write'#

'write' イベントは、書き込み操作が完了したときに発生します。書き込まれたバイト数がイベントハンドラの最初の引数として渡されます。

new fs.Utf8Stream([options])#
  • options <Object>
    • append: <boolean> 書き込みを切り詰めるのではなく、宛先ファイルに追加します。デフォルト: true
    • contentMode: <string> write 関数に送信できるデータの種類。サポートされている値は 'utf8' または 'buffer' です。デフォルト: 'utf8'
    • dest: <string> 書き込み対象のファイルへのパス (モードは append オプションで制御されます)。
    • fd: <number> ファイルディスクリプタ。fs.open()fs.openSync() によって返されるものです。
    • fs: <Object> fs モジュールと同じ API を持つオブジェクト。モック、テスト、またはストリームの動作をカスタマイズするのに役立ちます。
    • fsync: <boolean> 書き込みが完了するたびに fs.fsyncSync() を実行します。
    • maxLength: <number> 内部バッファの最大長。書き込み操作によってバッファが maxLength を超える場合、書き込まれたデータはドロップされ、ドロップされたデータとともに drop イベントが発生します。
    • maxWrite: <number> 書き込み可能な最大バイト数。デフォルト: 16384
    • minLength: <number> フラッシュする前に満たされている必要がある内部バッファの最小長。
    • mkdir: <boolean> true の場合、dest ファイルのディレクトリが存在することを確認します。デフォルト: false
    • mode: <number> | <string> 作成するファイルのモードを指定します (fs.open() を参照)。
    • periodicFlush: <number> periodicFlush ミリ秒ごとに flush を呼び出します。
    • retryEAGAIN <Function> write()writeSync()、または flushSync()EAGAIN または EBUSY エラーに遭遇したときに呼び出される関数。戻り値が true の場合、操作は再試行されます。そうでなければエラーをバブルアップします。err はこの関数が呼び出される原因となったエラー、writeBufferLen は書き込まれたバッファの長さ、remainingBufferLen はストリームが書き込みを試みなかった残りのバッファの長さです。
    • sync: <boolean> 書き込みを同期的に実行します。
utf8Stream.append#
  • <boolean> ストリームがファイルに追加しているか、切り詰めているか。
utf8Stream.contentMode#
  • <string> ストリームに書き込めるデータの種類。サポートされている値は 'utf8' または 'buffer' です。デフォルト: 'utf8'
utf8Stream.destroy()#

内部バッファをフラッシュせずに、ストリームを直ちに閉じます。

utf8Stream.end()#

内部バッファをフラッシュしてから、ストリームを正常に閉じます。

utf8Stream.fd#
  • <number> 書き込み先のファイルディスクリプタ。
utf8Stream.file#
  • <string> 書き込み先のファイル。
utf8Stream.flush(callback)#
  • callback <Function>
    • err <Error> | <null> フラッシュが失敗した場合はエラー、それ以外は null

書き込みが進行中でない場合、現在のバッファをファイルに書き込みます。minLength がゼロの場合や、すでに書き込み中の場合は何もしません。

utf8Stream.flushSync()#

バッファリングされたデータを同期的にフラッシュします。これはコストのかかる操作です。

utf8Stream.fsync#
  • <boolean> ストリームが各書き込み操作の後に fs.fsyncSync() を実行しているかどうか。
utf8Stream.maxLength#
  • <number> 内部バッファの最大長。書き込み操作によってバッファが maxLength を超える場合、書き込まれたデータはドロップされ、ドロップされたデータとともに drop イベントが発生します。
utf8Stream.minLength#
  • <number> フラッシュする前に満たされている必要がある内部バッファの最小長。
utf8Stream.mkdir#
  • <boolean> ストリームが dest ファイルのディレクトリが存在することを確認すべきかどうか。true の場合、ディレクトリが存在しない場合は作成します。デフォルト: false
utf8Stream.mode#
utf8Stream.periodicFlush#
  • <number> フラッシュ間のミリ秒数。0 に設定すると、定期的なフラッシュは実行されません。
utf8Stream.reopen(file)#
  • file: <string> | <Buffer> | <URL> 書き込み対象のファイルへのパス (モードは append オプションで制御されます)。

ファイルをインプレースで再オープンします。ログローテーションに役立ちます。

utf8Stream.sync#
  • <boolean> ストリームが同期的に書き込んでいるか非同期的に書き込んでいるか。
utf8Stream.write(data)#

ストリーム作成時に options.contentMode'utf8' に設定されている場合、data 引数は文字列でなければなりません。contentMode'buffer' に設定されている場合、data 引数は <Buffer>でなければなりません。

utf8Stream.writing#
  • <boolean> ストリームが現在ファイルにデータを書き込んでいるかどうか。
utf8Stream[Symbol.dispose]()#

utf8Stream.destroy() を呼び出します。

クラス: 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 によってエクスポートされます。

すべての定数がすべてのオペレーティングシステムで利用可能であるとは限りません。これは特に Windows で重要であり、POSIX 固有の定義の多くは利用できません。ポータブルなアプリケーションでは、使用前にそれらの存在を確認することをお勧めします。

複数の定数を使用するには、ビット単位 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 存在する場合、コピー操作は copy-on-write リフレックの作成を試みます。基盤となるプラットフォームが copy-on-write をサポートしていない場合、フォールバックのコピーメカニズムが使用されます。
COPYFILE_FICLONE_FORCE 存在する場合、コピー操作は copy-on-write リフレックの作成を試みます。基盤となるプラットフォームが copy-on-write をサポートしていない場合、操作はエラーで失敗します。

これらの定義は Windows でも利用可能です。

ファイルオープン定数#

以下の定数は fs.open() で使用するためのものです。

定数 説明
O_RDONLY ファイルを読み取り専用アクセスで開くことを示すフラグ。
O_WRONLY ファイルを書き込み専用アクセスで開くことを示すフラグ。
O_RDWR ファイルを読み書きアクセスで開くことを示すフラグ。
O_CREAT ファイルがまだ存在しない場合に作成することを示すフラグ。
O_EXCL O_CREAT フラグが設定され、ファイルが既に存在する場合にファイルを開くことが失敗することを示すフラグ。
O_NOCTTY パスが端末デバイスを識別する場合、パスを開いてもその端末がプロセスの制御端末にならないことを示すフラグ (プロセスがまだ制御端末を持っていない場合)。
O_TRUNC ファイルが存在し、通常のファイルであり、ファイルが書き込みアクセスで正常に開かれた場合、その長さがゼロに切り詰められることを示すフラグ。
O_APPEND データがファイルの末尾に追加されることを示すフラグ。
O_DIRECTORY パスがディレクトリでない場合、オープンが失敗することを示すフラグ。
O_NOATIME ファイルシステムへの読み取りアクセスが、ファイルに関連付けられた atime 情報の更新をもはや行わないことを示すフラグ。このフラグは Linux オペレーティングシステムでのみ利用可能です。
O_NOFOLLOW パスがシンボリックリンクである場合、オープンが失敗することを示すフラグ。
O_SYNC ファイルが同期 I/O で開かれ、書き込み操作がファイルの整合性を待つことを示すフラグ。
O_DSYNC ファイルが同期 I/O で開かれ、書き込み操作がデータの整合性を待つことを示すフラグ。
O_SYMLINK シンボリックリンクが指しているリソースではなく、シンボリックリンク自体を開くことを示すフラグ。
O_DIRECT 設定されている場合、ファイル I/O のキャッシュ効果を最小限に抑える試みが行われます。
O_NONBLOCK 可能な場合にファイルを非ブロッキングモードで開くことを示すフラグ。
UV_FS_O_FILEMAP 設定されている場合、メモリファイルマッピングを使用してファイルにアクセスします。このフラグは Windows オペレーティングシステムでのみ利用可能です。他のオペレーティングシステムでは、このフラグは無視されます。

Windows では、O_APPEND, O_CREAT, O_EXCL, O_RDONLY, O_RDWR, O_TRUNC, O_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_IFCHR, S_IFDIR, S_IFLNK, S_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)}`);
}); 

一方の結果を await してから他方を呼び出すことで、操作を正しく順序付けることが重要です。

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> を使用して指定されたパスは、ファイルパスを不透明なバイトシーケンスとして扱う特定の POSIX オペレーティングシステムで主に役立ちます。このようなシステムでは、単一のファイルパスに複数の文字エンコーディングを使用するサブシーケンスが含まれる可能性があります。文字列パスと同様に、<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 では、ファイルが追記モードで開かれている場合、位置指定書き込みは機能しません。カーネルは位置引数を無視し、常にデータをファイルの末尾に追記します。

ファイルを置き換えるのではなく変更するには、flag オプションをデフォルトの 'w' ではなく 'r+' に設定する必要があるかもしれません。

一部のフラグの動作はプラットフォームに固有です。そのため、以下の例のように 'a+' フラグを使用して macOS や Linux でディレクトリを開くとエラーが返されます。対照的に、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() を呼び出すことで、ファイルの内容をリセットできます。