Start · Sprachen · JavaScript · Referenz · FileSystemEntry.getParent()

FileSystemEntry.getParent()

Methode

Ermittelt asynchron das übergeordnete Verzeichnis eines Eintrags und übergibt es als <code>FileSystemDirectoryEntry</code> an einen Callback.

seit JavaScript File and Directory Entries API, Chromium, Safari 1 Kategorie: webapi

Signatur

FileSystemEntry.prototype.getParent(successCallback, errorCallback)

Beschreibung

getParent() gehört zur File and Directory Entries API. Die Methode gibt nichts direkt zurück. Das übergeordnete Verzeichnis eines FileSystemFileEntry oder FileSystemDirectoryEntry kommt über einen Callback an. Du brauchst sie vor allem, wenn du in einem per Drag & Drop abgelegten Ordner (über DataTransferItem.webkitGetAsEntry()) oder in einer Ordnerauswahl mit <input type="file" webkitdirectory> (über webkitEntries) nach oben navigieren willst.

Die API arbeitet nur mit Callbacks und nicht mit Promises. In moderner Codebasis packt man den Aufruf deshalb meist in ein Promise, damit man async/await nutzen kann. Der Erfolgs-Callback bekommt den Eltern-Eintrag. Der Fehler-Callback bekommt eine DOMException.

Wichtig: Beim Wurzelverzeichnis des virtuellen Dateisystems liefert getParent() das Wurzelverzeichnis selbst. Beim Hochlaufen erkennst du das Ende also daran, dass fullPath des Elternteils gleich "/" bzw. gleich dem aktuellen Pfad ist, und nicht an null.

Parameter

Name Typ Default Beschreibung
$successCallback (parent: FileSystemDirectoryEntry) => void Wird mit dem übergeordneten FileSystemDirectoryEntry aufgerufen. Formal optional, ohne ihn ist der Aufruf aber sinnlos.
$errorCallback (error: DOMException) => void Wird aufgerufen, wenn das Elternverzeichnis nicht ermittelt werden kann, z. B. weil der Eintrag nicht mehr existiert oder der Zugriff verweigert wird.

Rückgabewert

Typ
undefined
Beschreibung
Kein direkter Rückgabewert. Das Ergebnis kommt asynchron über successCallback.

Beispiele

Elternordner einer per Drag & Drop abgelegten Datei ermitteln

const dropZone = document.querySelector('#drop');

dropZone.addEventListener('dragover', (e) => e.preventDefault());

dropZone.addEventListener('drop', (e) => {
  e.preventDefault();
  const entry = e.dataTransfer.items[0]?.webkitGetAsEntry();
  if (!entry) return;

  entry.getParent(
    (parent) => console.log(`${entry.name} liegt in: ${parent.fullPath}`),
    (err) => console.error('Elternordner nicht ermittelbar:', err.name)
  );
});
bericht.pdf liegt in: /

Promise-Wrapper für async/await

const getParentAsync = (entry) =>
  new Promise((resolve, reject) => entry.getParent(resolve, reject));

// Nutzung, z. B. im drop-Handler:
const logParent = async (entry) => {
  try {
    const parent = await getParentAsync(entry);
    console.log('Eltern:', parent.name || '(Wurzel)', parent.isDirectory);
  } catch (err) {
    console.error(err);
  }
};
Eltern: fotos true

Pfad bis zur Wurzel hochlaufen

const getParentAsync = (entry) =>
  new Promise((resolve, reject) => entry.getParent(resolve, reject));

const ancestors = async (entry) => {
  const chain = [];
  let current = entry;
  while (true) {
    const parent = await getParentAsync(current);
    // Die Wurzel ist ihr eigener Elternteil, also hier abbrechen
    if (parent.fullPath === current.fullPath) break;
    chain.push(parent.fullPath);
    current = parent;
  }
  return chain;
};

// Für einen Eintrag /projekt/src/index.js:
// ancestors(fileEntry).then(console.log);
["/projekt/src", "/projekt", "/"]

// Wichtig · Fallstricke

  • Wurzel-Sonderfall: Für das Wurzelverzeichnis liefert getParent() das Wurzelverzeichnis selbst und nicht null. Schleifen, die nach oben laufen, brauchen eine eigene Abbruchbedingung, sonst laufen sie endlos.
  • Keine Promises: Die Methode arbeitet nur mit Callbacks. Ein direktes await entry.getParent() gibt einfach undefined zurück.
  • Begrenzter Sichtbereich: Du kommst nur bis zur Wurzel des virtuellen Dateisystems, das der Browser für den Drop bzw. die Auswahl anlegt. Echte Pfade des Betriebssystems bleiben aus Sicherheitsgründen verborgen.
  • Kompatibilität: Die API ist nicht standardisiert und nur teilweise umgesetzt. Chromium-Browser unterstützen sie vollständig, Firefox und Safari nur mit Einschränkungen. Prüfe die aktuelle Kompatibilitätstabelle, bevor du dich auf getParent() verlässt. Für neue Projekte mit Lese- und Schreibzugriff ist die File System Access API bzw. das Origin Private File System (FileSystemHandle) meist die bessere Wahl.
  • Die Einträge gelten nur, solange das Drop- bzw. Auswahl-Ereignis den Zugriff erlaubt. Hebe DataTransferItem-Objekte nicht über das Ereignis hinaus auf, sondern hole die Einträge synchron im Handler.