Start · Sprachen · JavaScript · Referenz · FileSystemHandle.isSameEntry()

FileSystemHandle.isSameEntry()

Methode

Vergleicht zwei <code>FileSystemHandle</code>-Objekte und löst mit <code>true</code> auf, wenn beide auf dieselbe Datei bzw. dasselbe Verzeichnis zeigen.

seit JavaScript Chromium 86+ (Chrome, Edge, Opera), Safari 15.2+, Kategorie: webapi

Signatur

FileSystemHandle.prototype.isSameEntry(fileSystemHandle)

Beschreibung

Die Methode isSameEntry() der Schnittstelle FileSystemHandle prüft asynchron, ob zwei Handles denselben Eintrag im Dateisystem darstellen, also dieselbe Datei oder dasselbe Verzeichnis. Da Handles Objekte sind, bringt ein Vergleich mit === hier nichts: Zwei getrennt geholte Handles für dieselbe Datei sind unterschiedliche Objekte. isSameEntry() vergleicht dagegen den tatsächlichen Eintrag, auf den sie zeigen.

Typische Einsatzfälle:

  • Doppelte Einträge in einer Liste zuletzt geöffneter Dateien vermeiden (etwa bei Handles, die in IndexedDB gespeichert sind).
  • Prüfen, ob eine Datei, die der Nutzer gerade gewählt hat, schon in einem Editor-Tab offen ist.
  • Verhindern, dass ein Verzeichnis in sich selbst kopiert wird oder eine Datei sich selbst überschreibt.

Die Methode gibt ein Promise zurück. Handles unterschiedlicher Art (kind ist "file" bzw. "directory") sind nie gleich. Wenn du wissen willst, wo ein Handle innerhalb eines Verzeichnisses liegt, ist FileSystemDirectoryHandle.resolve() die passende Ergänzung.

Parameter

Name Typ Default Beschreibung
$fileSystemHandle Pflicht FileSystemHandle | FileSystemFileHandle | FileSystemDirectoryHandle Das Handle, das mit dem aktuellen Handle (this) verglichen wird.

Rückgabewert

Typ
Promise<boolean>
Beschreibung
Ein Promise, das mit true auflöst, wenn beide Handles auf denselben Eintrag zeigen, sonst mit false.

Beispiele

Zwei vom Nutzer gewählte Dateien vergleichen

const vergleicheAuswahl = async () => {
  // Aufruf muss durch eine Nutzergeste ausgelöst werden (z. B. Klick)
  const [ersteDatei] = await window.showOpenFilePicker();
  const [zweiteDatei] = await window.showOpenFilePicker();

  console.log('Gleiches Objekt?', ersteDatei === zweiteDatei);
  console.log('Gleicher Eintrag?', await ersteDatei.isSameEntry(zweiteDatei));
};

document.querySelector('#vergleichen').addEventListener('click', vergleicheAuswahl);
Gleiches Objekt? false Gleicher Eintrag? true // wenn zweimal dieselbe Datei gewählt wurde

Schon offene Datei im Editor erkennen

const offeneDateien = []; // Array von FileSystemFileHandle

const findeOffeneDatei = async (handle) => {
  for (const offen of offeneDateien) {
    if (await offen.isSameEntry(handle)) return offen;
  }
  return null;
};

const dateiOeffnen = async () => {
  const [handle] = await window.showOpenFilePicker();
  const vorhanden = await findeOffeneDatei(handle);
  if (vorhanden) {
    console.log(`"${handle.name}" ist bereits geöffnet.`);
    return vorhanden;
  }
  offeneDateien.push(handle);
  console.log(`"${handle.name}" neu geöffnet.`);
  return handle;
};

document.querySelector('#oeffnen').addEventListener('click', dateiOeffnen);
"notizen.txt" neu geöffnet. "notizen.txt" ist bereits geöffnet.

Vergleich im Origin Private File System (OPFS)

const opfsDemo = async () => {
  const root = await navigator.storage.getDirectory();
  const a = await root.getFileHandle('daten.json', { create: true });
  const b = await root.getFileHandle('daten.json');
  const c = await root.getFileHandle('andere.json', { create: true });

  console.log(await a.isSameEntry(b)); // gleicher Eintrag
  console.log(await a.isSameEntry(c)); // anderer Eintrag
  console.log(await root.isSameEntry(a)); // Verzeichnis vs. Datei
};

opfsDemo();
true false false

// Wichtig · Fallstricke

  • Kein === verwenden: Getrennt geholte Handles für denselben Eintrag sind unterschiedliche Objekte. Nur isSameEntry() vergleicht zuverlässig.
  • Asynchron: Das Ergebnis ist ein Promise. Ein vergessenes await in einer if-Bedingung ergibt immer einen wahren Wert, weil ein Promise-Objekt truthy ist. Das ist ein häufiger Fehler.
  • Performance: Wer viele Handles nacheinander vergleicht, macht viele asynchrone Aufrufe. Bei großen Listen lohnt es sich, zuerst nach name und kind vorzufiltern.
  • Browser-Unterstützung: Für das lokale Dateisystem (showOpenFilePicker() und Co.) gibt es die Methode nur in Chromium-Browsern. Firefox und Safari unterstützen sie im Origin Private File System (navigator.storage.getDirectory()). Sie steht nur in sicheren Kontexten (HTTPS) und auch in Web Workern zur Verfügung.
  • Die Datei-Auswahldialoge brauchen eine Nutzergeste und öffnen sich nicht in herkunftsfremden iframes.