Start · Sprachen · JavaScript · Referenz · FileSystemDirectoryHandle.resolve()

FileSystemDirectoryHandle.resolve()

Methode

Liefert ein Promise mit dem relativen Pfad (Array von Namen) vom Verzeichnis-Handle bis zu einem Nachfahren-Eintrag, oder <code>null</code>, wenn kein Nachfahre.

seit JavaScript Baseline 2023: alle modernen Browser (in sicheren Kategorie: webapi

Signatur

FileSystemDirectoryHandle.prototype.resolve(possibleDescendant)

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

Typ
Promise<string[] | null>
Beschreibung
Ein Promise, das mit einem Array von Namen erfüllt wird (vom Verzeichnis bis zum Eintrag, der Eintrag selbst zuletzt). Ist das Handle das Verzeichnis selbst, kommt [] 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('/'));
["dokumente", "berichte", "q1.txt"] dokumente/berichte/q1.txt

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));
false true []

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() und showOpenFilePicker() gibt es dagegen nur in Chromium-Browsern.
  • Kein Nachfahre ergibt null, keinen Fehler. Prüfe also ausdrücklich auf null, 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.name selbst vorne an.
  • In großen Verzeichnisbäumen kann die Auflösung dauern, daher immer mit await bzw. asynchron arbeiten.