Signatur
Beschreibung
Die Methode resolve() eines FileSystemDirectoryHandle ermittelt, wo ein anderes Handle innerhalb des Verzeichnisses liegt. Das Ergebnis ist ein Array mit Verzeichnisnamen vom aktuellen Verzeichnis bis zum gesuchten Eintrag. Das letzte Element ist der Name der Datei bzw. des Verzeichnisses selbst.
Liegt das übergebene Handle nicht unterhalb des Verzeichnisses, wird das Promise mit null erfüllt. Ist das Handle das Verzeichnis selbst, gibt es ein leeres Array [] zurück. Damit kann man auch einfach prüfen, ob ein Eintrag zu einem Verzeichnisbaum gehört.
Gebraucht wird das vor allem für Brotkrümel-Navigationen, Dateibaum-Ansichten, Editoren mit Projektordner und für die Arbeit mit dem Origin Private File System (OPFS) über navigator.storage.getDirectory(). Dort ist die Methode in allen modernen Browsern vorhanden. Bei Handles vom Benutzer-Dateisystem (showDirectoryPicker()) funktioniert sie dagegen nur in Chromium-Browsern.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $possibleDescendant Pflicht | FileSystemHandle | Das FileSystemFileHandle oder FileSystemDirectoryHandle, dessen relativer Pfad bestimmt werden soll. |
Rückgabewert
[] zurück, ist es kein Nachfahre, kommt null zurück.Beispiele
Relativen Pfad im OPFS ermitteln
const root = await navigator.storage.getDirectory();
const docs = await root.getDirectoryHandle('dokumente', { create: true });
const berichte = await docs.getDirectoryHandle('berichte', { create: true });
const datei = await berichte.getFileHandle('q1.txt', { create: true });
const pfad = await root.resolve(datei);
console.log(pfad);
console.log(pfad.join('/'));
Prüfen, ob ein Eintrag im Verzeichnis liegt
const root = await navigator.storage.getDirectory();
const a = await root.getDirectoryHandle('a', { create: true });
const b = await root.getDirectoryHandle('b', { create: true });
const datei = await b.getFileHandle('notiz.md', { create: true });
const istEnthalten = async (dir, handle) => (await dir.resolve(handle)) !== null;
console.log(await istEnthalten(a, datei));
console.log(await istEnthalten(b, datei));
console.log(await b.resolve(b));
Brotkrümel-Navigation für einen Projektordner
// Muss durch eine Benutzeraktion ausgelöst werden (Chromium)
document.querySelector('#oeffnen').addEventListener('click', async () => {
const projekt = await window.showDirectoryPicker();
const [dateiHandle] = await window.showOpenFilePicker({ startIn: projekt });
const teile = await projekt.resolve(dateiHandle);
const nav = document.querySelector('#breadcrumb');
nav.textContent = teile
? [projekt.name, ...teile].join(' › ')
: `${dateiHandle.name} (außerhalb des Projekts)`;
});
// Wichtig · Fallstricke
- Kompatibilität: Nur in sicheren Kontexten (HTTPS) verfügbar. Mit OPFS-Handles funktioniert die Methode in Chrome, Edge, Firefox und Safari.
showDirectoryPicker()undshowOpenFilePicker()gibt es dagegen nur in Chromium-Browsern. - Kein Nachfahre ergibt
null, keinen Fehler. Prüfe also ausdrücklich aufnull, bevor du z. B.join()aufrufst. - Das Array enthält nur relative Namen, keinen absoluten Pfad auf dem Datenträger. Das ist Absicht: Aus Datenschutzgründen legt die API keine echten Systempfade offen.
- Der Name des Ausgangsverzeichnisses steht nicht im Ergebnis. Bei Bedarf fügst du
dirHandle.nameselbst vorne an. - In großen Verzeichnisbäumen kann die Auflösung dauern, daher immer mit
awaitbzw. asynchron arbeiten.