Signatur
Beschreibung
Mit getFileHandle() greifen Sie über ein FileSystemDirectoryHandle auf eine Datei zu, die direkt in diesem Verzeichnis liegt. Das zurückgegebene FileSystemFileHandle dient danach zum Lesen (getFile()) oder Schreiben (createWritable() bzw. createSyncAccessHandle() in Workern).
Standardmäßig muss die Datei schon vorhanden sein, sonst wird das Promise mit einem NotFoundError abgelehnt. Mit { create: true } wird eine fehlende Datei als leere Datei angelegt. Eine bereits vorhandene Datei bleibt dabei unverändert und wird nicht geleert.
Typische Einsatzorte sind das Origin Private File System (OPFS), das Sie über navigator.storage.getDirectory() erhalten und das in allen modernen Browsern verfügbar ist, sowie Verzeichnisse, die der Nutzer mit window.showDirectoryPicker() ausgewählt hat. Letzteres gibt es nur in Chromium-Browsern.
Der Parameter name ist ein einzelner Dateiname und kein Pfad. Für Dateien in Unterordnern gehen Sie mit getDirectoryHandle() Schritt für Schritt durch die Ordnerebenen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $name Pflicht | string | Name der Datei im aktuellen Verzeichnis. Er darf kein Pfadtrennzeichen (/, \) enthalten und nicht ., .. oder leer sein. |
|
| $options | object | {} | Optionales Objekt mit Einstellungen. |
| $options.create | boolean | false | Bei true wird eine fehlende Datei angelegt. Bei false führt eine fehlende Datei zu einem NotFoundError. |
Rückgabewert
FileSystemFileHandle der Datei erfüllt wird. Es wird abgelehnt mit NotFoundError (Datei fehlt und create ist nicht gesetzt), TypeMismatchError (unter dem Namen existiert ein Verzeichnis), TypeError (ungültiger Name), NotAllowedError (Berechtigung fehlt) oder QuotaExceededError (Speicherplatz reicht nicht).Beispiele
Datei im OPFS anlegen und beschreiben
const root = await navigator.storage.getDirectory();
// Datei anlegen, falls sie noch nicht existiert
const fileHandle = await root.getFileHandle('notizen.txt', { create: true });
const writable = await fileHandle.createWritable();
await writable.write('Hallo OPFS!');
await writable.close();
const file = await fileHandle.getFile();
console.log(file.name, await file.text());
Prüfen, ob eine Datei existiert
const fileExists = async (dirHandle, name) => {
try {
await dirHandle.getFileHandle(name); // ohne create
return true;
} catch (err) {
if (err.name === 'NotFoundError') return false;
throw err; // z. B. TypeMismatchError bei einem Ordner
}
};
const root = await navigator.storage.getDirectory();
console.log(await fileExists(root, 'config.json'));
Datei in einem verschachtelten Pfad auflösen
const getFileByPath = async (root, path, create = false) => {
const parts = path.split('/').filter(Boolean);
const fileName = parts.pop();
let dir = root;
for (const part of parts) {
dir = await dir.getDirectoryHandle(part, { create });
}
return dir.getFileHandle(fileName, { create });
};
const root = await navigator.storage.getDirectory();
const handle = await getFileByPath(root, 'daten/2024/bericht.csv', true);
console.log(handle.kind, handle.name);
Datei in einem vom Nutzer gewählten Ordner lesen (Chromium)
document.querySelector('#open').addEventListener('click', async () => {
const dir = await window.showDirectoryPicker();
try {
const handle = await dir.getFileHandle('package.json');
const json = JSON.parse(await (await handle.getFile()).text());
console.log('Projekt:', json.name);
} catch (err) {
console.error('package.json nicht gefunden:', err.name);
}
});
// Wichtig · Fallstricke
- Kein Pfad: Übergeben Sie etwa
'a/b.txt', wird das Promise mit einemTypeErrorabgelehnt. Unterordner lösen Sie mitgetDirectoryHandle()auf. - Namenskonflikt: Heißt ein Verzeichnis so wie die gesuchte Datei, schlägt der Aufruf auch mit
{ create: true }fehl, und zwar mit einemTypeMismatchError. create: trueleert nichts: Eine vorhandene Datei bleibt erhalten. Zum Überschreiben verwenden SiecreateWritable(). Diese Methode schreibt standardmäßig in eine neue, leere Datei, die das Original beimclose()ersetzt.- Berechtigungen: Bei Ordnern aus
showDirectoryPicker()ist fürcreate: trueeine Schreibberechtigung nötig (requestPermission({ mode: 'readwrite' })). Im OPFS ist keine Berechtigung erforderlich. - Kompatibilität: Im OPFS funktioniert
getFileHandle()in allen modernen Browsern.showDirectoryPicker()gibt es dagegen nur in Chromium (Chrome, Edge, Opera), nicht in Firefox und Safari. - Die API steht nur in einem sicheren Kontext (HTTPS) zur Verfügung, sowohl im Hauptthread als auch in Workern.