前回からのつづき
前回、 OPFS のファイル操作について、FileSystemWritableFileStream オブジェクトについて説明を行いました。今回は、その続きとして、FileSystemSyncAccessHandle オブジェクトから説明していきたいと思います。
FileSystemSyncAccessHandle オブジェクト
FileSystemSyncAccessHandle は、FileSystemWritableFileStream オブジェクトと同様に、ファイルへの書き込みを行うためのオブジェクトです。
FileSystemFileHandle オブジェクトの createSyncAccessHandle() メソッドで取得します。
FileSystemFileHandle オブジェクトの非同期処理に対し、FileSystemSyncAccessHandle オブジェクトは、同期処理を行います。
その為、このオブジェクトを使った操作は、ブラウザのイベントループ処理では、使用できません。使用には、 Web Worker が必要です。
FileSystemWritableFileStream と比較すると、
| アクセス | WritableFileStream | SyncAccessHandle |
|---|---|---|
| 非同期 | ○ | × |
| Stream対応 | ○ | × |
| seek() | ○ | × |
| read() | × | ○ |
| write() | ○ | ○ |
| truncate() | ○ | ○ |
| getSize() | × | ○ |
| flush() | × | ○ |
FileSystemSyncAccessHandle は「ファイルストリーム」ではなく、「ランダムアクセス可能なファイルハンドル」です。
read() メソッド
ファイルの指定位置から読み込みます。
const buffer = new Uint8Array(1024);
const bytesRead =
accessHandle.read(
buffer,
{ at: 0 }
);
■ パラメータ
読み込みバッファ領域:データを読み込むバッファの変数
位置オブジェクト:
{
at: 読み込みバイト位置(先頭0)
}
■ 戻り値
実際に読み込んだバイト数
write() メソッド
指定位置へ書き込みます。
const bytes = new TextEncoder().encode("Hello");
accessHandle.write(
bytes,
{ at: 0 }
);
■ パラメータ
書き込みバッファ領域:データを書き込むバッファ
バッファには、ArrayBufferView が指定可能です。
※ ArrayBufferView は、TypedArray , DataView の総称です。
FileSystemWritableFileStream オブジェクトの write() メソッドと違い、String や Blob は指定できません。
位置オブジェクト:
{
at: 読み込みバイト位置(先頭0)
}
■ 戻り値
実際に書き込んだバイト数
getSize() メソッド
現在のファイルのバイトサイズを取得します。
const size = accessHandle.getSize();
■ パラメータ
なし
■ 戻り値
現在のファイルのバイトサイズ
例えば、
Hello OPFS
を UTF-8 で保存した場合は 10 バイトなので 10 が返ります。
※ 日本語のようなマルチバイト文字を保存した場合は、文字数とファイルサイズは一致しないことがあります。
truncate() オブジェクト
ファイルサイズを変更します。
accessHandle.truncate(5);
■ パラメータ
ファイルサイズ(バイト)
■ 戻り値
undefined
例えば、現在のファイルサイズが 100 バイトの場合
accessHandle.truncate(10);
を実行すると 10 バイト以降のデータが削除されます。
逆に、
accessHandle.truncate(1000);
を実行すると 1000 バイトへ拡張されます。
flush() メソッド
変更内容を確実に保存します。
write() での書き込みは一時的にバッファに格納された後、ストレージに書き出されます。この処理は、その内容を強制的にストレージへ反映します。
accessHandle.flush();
■ パラメータ
なし
■ 戻り値
undefined
後述の close() を呼び出す際にも通常は保存されますが、複数回の書き込みで、都度、確実に保存したい場合などに利用します。
accessHandle.write(bytes1);
accessHandle.flush();
accessHandle.write(bytes2);
accessHandle.flush();
accessHandle.write(bytes3);
accessHandle.flush();
close() メソッド
ハンドルを閉じます。
accessHandle.close();
■ パラメータ
なし
■ 戻り値
undefined
👉 閉じた後は使用できません。
まとめ
- FileSystemFileHandle はファイルを操作するための Handle オブジェクト
- getFile() で File オブジェクトを取得できる。
- createWritable() で FileSystemWritableFileStream を取得できる。
- createSyncAccessHandle() で FileSystemSyncAccessHandle を取得できる。
- File オブジェクトは読み込み担当
- FileSystemWritableFileStream は書き込み担当
- FileSystemSyncAccessHandle は読み書き可能だが、同期処理の為イベントループでは使用できず、 Web Worker が必要
- remove() によりファイル削除も可能
- 実際のファイル操作は FileSystemFileHandle を起点として行う。