The getDirectory()
method of the StorageManager
interface is used to obtain a reference to a FileSystemDirectoryHandle
object allowing access to a directory and its contents, stored in the origin private file system (OPFS).
A Promise
that fulfills with a FileSystemDirectoryHandle
object.
The following asynchronous event handler function is contained inside a Web Worker. On receiving a message from the main thread it:
- Gets a
FileSystemDirectoryHandle
representing the root of the OPFS using getDirectory()
, storing it in the root
variable. - Gets a file handle using
FileSystemDirectoryHandle.getFileHandle()
. - Creates a synchronous file access handle using
FileSystemFileHandle.createSyncAccessHandle()
. - Gets the size of the file and creates an
ArrayBuffer
to contain it. - Reads and writes to the file.
- Persists the changes to disk and closes the synchronous access handle.
onmessage = async (e) => {
const message = e.data;
const root = await navigator.storage.getDirectory();
const draftHandle = await root.getFileHandle("draft.txt", { create: true });
const accessHandle = await draftHandle.createSyncAccessHandle();
const fileSize = accessHandle.getSize();
const buffer = new DataView(new ArrayBuffer(fileSize));
const readBuffer = accessHandle.read(buffer, { at: 0 });
const encoder = new TextEncoder();
const encodedMessage = encoder.encode(message);
const writeBuffer = accessHandle.write(encodedMessage, { at: readBuffer });
accessHandle.flush();
accessHandle.close();
};
Note: In earlier versions of the spec, close()
, flush()
, getSize()
, and truncate()
were wrongly specified as asynchronous methods, and older versions of some browsers implement them in this way. However, all current browsers that support these methods implement them as synchronous methods.