はじめに

前回は、OPFS のディレクトリ操作を担当する FileSystemDirectoryHandle オブジェクトについて解説しました。

今回は、実際にファイルを操作するための FileSystemFileHandle オブジェクトについて解説します。

ファイルへの読み込みや書き込みは、FileSystemFileHandle オブジェクトを起点として行います。

また、実際の読み書きには、

  • File
  • FileSystemWritableFileStream
  • FileSystemSyncAccessHandle

といったオブジェクトも登場します。

それでは、それぞれの役割を理解しながら見ていきたいと思います。


FileSystemFileHandle オブジェクト

FileSystemFileHandle オブジェクトは、ファイルを操作するための Handle オブジェクトです。

ディレクトリを表す FileSystemDirectoryHandle オブジェクトと同様に、FileSystemHandle オブジェクトを継承しています。

そのため、

  • name
  • kind
  • isSameEntry()

など、FileSystemDirectoryHandle オブジェクトと共通のプロパティやメソッドも利用できます。

FileSystemFileHandle オブジェクトの取得は、FileSystemDirectoryHandle オブジェクトの getFileHandle() メソッドで行います。

const root = await navigator.storage.getDirectory();

const fileHandle =
  await root.getFileHandle(
    "sample.txt",
    { create: true }
  );


name プロパティ

ファイル名を取得します。

console.log(fileHandle.name); // 例:sample.txt


kind プロパティ

ファイル種別を取得します。常に、"file" が返されます。

console.log(fileHandle.kind); // file


getFile() メソッド

ファイル内容を取得するための File オブジェクトを返します。

const file = await fileHandle.getFile();

■ パラメータ

なし

■ 戻り値

Promise オブジェクト

await 完了後、File オブジェクト


createWritable() メソッド

非同期的にファイルへ書き込むための FileSystemWritableFileStream オブジェクトを取得します。

const writable = await fileHandle.createWritable();

■ パラメータ

なし

■ 戻り値

Promise オブジェクト

await 完了後、FileSystemWritableFileStream オブジェクト


createSyncAccessHandle() メソッド

同期的にファイルへアクセスするための FileSystemSyncAccessHandle オブジェクトを取得します。

OPFS 専用のメソッドです。

const accessHandle = await fileHandle.createSyncAccessHandle();

■ パラメータ

なし

■ 戻り値

Promise オブジェクト

await 完了後、FileSystemSyncAccessHandle オブジェクト

※ 本メソッドで取得できる FileSystemSyncAccessHandle オブジェクトを使用した同期的な書き込みは、ブラウザのJavaScript のイベントループの中では使用できません。ループ処理をブロックしてしまうからです。使用には、 Web Worker が必要です。


remove() メソッド

ファイル自身を削除します。

await fileHandle.remove();

■ パラメータ

なし

■ 戻り値

Promise オブジェクト

await 完了後、undefined

👉 ただし、ブラウザによって実装状況に差があるため注意が必要です。

互換性を重視する場合は、

await dirHandle.removeEntry("sample.txt");

を利用する方が安全です。


isSameEntry() メソッド

FileSystemHandle から継承されたメソッドです。2つの Handle が同じファイル(またはディレクトリ)を指しているか判定できます。

const result = await fileHandle1.isSameEntry(fileHandle2);

■ パラメータ

比較する別の FileSystemFileHandle オブジェクト

■ 戻り値

Promise オブジェクト

await 完了後、同じであれば true 違っていれば false

👉 FileSystemFileHandle は FileSystemHandle を継承しているため、isSameEntry() も利用できますが、日常的に使う機会はそれほど多くありません。


File オブジェクト

getFile() メソッドで取得できるオブジェクトです。

const file = await fileHandle.getFile();

ファイル内容の読み込みを担当します。

File は、Blob の派生クラスです。

👉 File オブジェクトは Blob を継承しているため、 slice() など Blob の機能も利用できます。


text() メソッド

テキストとして読み込みます。

const text = await file.text();

■ パラメータ

なし

■ 戻り値

Promise オブジェクト

await 完了後、読み込んだ文字列


arrayBuffer() メソッド

ArrayBuffer として取得します。

画像や音声などのバイナリデータを扱う場合によく利用されます。

const buffer = await file.arrayBuffer();

console.log(buffer.byteLength);

■ パラメータ

なし

■ 戻り値

Promise オブジェクト

await 完了後、ArrayBuffer オブジェクト

Uint8Arrayへ変換する例

const buffer = await file.arrayBuffer();

const bytes = new Uint8Array(buffer);

※ bytes は、見た目だけのオブジェクトであり、実態は、buffer と同一のものを指しています。


stream() メソッド

ReadableStream オブジェクトを取得します。

const stream = file.stream();

■ パラメータ

なし

■ 戻り値

ReadableStream オブジェクト

👉 巨大なファイルを扱う場合に利用されます。

(つづく)