Start · Sprachen · JavaScript · Referenz · FileSystemEntry.filesystem

FileSystemEntry.filesystem

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>FileSystem</code>-Objekt liefert, zu dem der Datei- oder Verzeichniseintrag gehört.

seit JavaScript Baseline: alle modernen Browser (File and Director Kategorie: webapi

Signatur

FileSystemEntry.filesystem

Beschreibung

Die schreibgeschützte Eigenschaft filesystem eines FileSystemEntry (und damit auch von FileSystemFileEntry und FileSystemDirectoryEntry) verweist auf das FileSystem-Objekt, in dem sich der Eintrag befindet. Über dieses Objekt kommt man an den Namen des Dateisystems (filesystem.name) und an das Wurzelverzeichnis (filesystem.root).

In der Praxis braucht man die Eigenschaft vor allem bei Drag-and-drop oder bei <input type="file" webkitdirectory>. Mit DataTransferItem.webkitGetAsEntry() erhält man Einträge, und über entry.filesystem.root lässt sich das virtuelle Wurzelverzeichnis der abgelegten Auswahl durchlaufen oder ein Eintrag über einen Pfad relativ zur Wurzel ansprechen.

Alle Einträge, die aus derselben Drag-and-drop-Aktion stammen, teilen sich in der Regel dasselbe FileSystem-Objekt. Deshalb kann man mit der Eigenschaft auch prüfen, ob zwei Einträge aus derselben Quelle kommen.

Rückgabewert

Typ
FileSystem
Beschreibung
Ein FileSystem-Objekt mit den Eigenschaften name (string) und root (FileSystemDirectoryEntry).

Beispiele

Dateisystem eines per Drag-and-drop abgelegten Eintrags auslesen

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

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

dropZone.addEventListener('drop', (event) => {
  event.preventDefault();
  for (const item of event.dataTransfer.items) {
    const entry = item.webkitGetAsEntry();
    if (!entry) continue;
    const fs = entry.filesystem;
    console.log(`Eintrag: ${entry.fullPath}`);
    console.log(`Dateisystem: ${fs.name}`);
    console.log(`Wurzel: ${fs.root.fullPath}`);
  }
});
Eintrag: /bilder Dateisystem: 3f2a…-dropped-files Wurzel: /

Datei über Pfad relativ zur Wurzel des Dateisystems öffnen

const getFileFromRoot = (entry, path) =>
  new Promise((resolve, reject) => {
    entry.filesystem.root.getFile(path, {}, resolve, reject);
  });

const readText = (fileEntry) =>
  new Promise((resolve, reject) => {
    fileEntry.file((file) => file.text().then(resolve, reject), reject);
  });

document.querySelector('#drop-zone').addEventListener('drop', async (event) => {
  event.preventDefault();
  const entry = event.dataTransfer.items[0]?.webkitGetAsEntry();
  if (!entry) return;
  try {
    const readme = await getFileFromRoot(entry, `${entry.fullPath}/README.md`);
    console.log(await readText(readme));
  } catch (err) {
    console.warn('README.md nicht gefunden:', err.name);
  }
});
# Mein Projekt …

Prüfen, ob zwei Einträge aus derselben Quelle stammen

const sameSource = (a, b) => a.filesystem === b.filesystem;

document.querySelector('#drop-zone').addEventListener('drop', (event) => {
  event.preventDefault();
  const entries = [...event.dataTransfer.items]
    .map((item) => item.webkitGetAsEntry())
    .filter(Boolean);
  if (entries.length >= 2) {
    console.log('Gleiches Dateisystem:', sameSource(entries[0], entries[1]));
  }
});
Gleiches Dateisystem: true

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an filesystem wird ignoriert (im Strict Mode kommt es zu einem TypeError).
  • Virtuelles Dateisystem: filesystem.root steht nicht für das echte Wurzelverzeichnis der Festplatte. Es ist eine Sandbox, die nur die vom Nutzer abgelegten oder ausgewählten Dateien enthält. Echte Pfade des Betriebssystems bekommt man darüber nicht.
  • Der Name ist nicht fest: filesystem.name wird vom Browser vergeben und ist je nach Implementierung verschieden. Man sollte sich nicht auf ein bestimmtes Format verlassen.
  • Zeitpunkt: webkitGetAsEntry() muss direkt im drop-Handler aufgerufen werden, also synchron. Danach ist die DataTransferItemList nicht mehr gültig.
  • Kompatibilität: Die Eigenschaft wird in Chrome, Edge, Firefox und Safari unterstützt. Die Methoden der zugehörigen API arbeiten aber mit Callbacks statt mit Promises. Für neue Projekte mit Schreibzugriff ist die File System Access API (FileSystemHandle) oder das Origin Private File System oft besser geeignet.