Signatur
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
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);
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);
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();
// Wichtig · Fallstricke
- Kein
===verwenden: Getrennt geholte Handles für denselben Eintrag sind unterschiedliche Objekte. NurisSameEntry()vergleicht zuverlässig. - Asynchron: Das Ergebnis ist ein
Promise. Ein vergessenesawaitin einerif-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
nameundkindvorzufiltern. - 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.