Signatur
Beschreibung
DirectoryEntrySync gehört zur synchronen Variante der alten File and Directory Entries API (früher „FileSystem API“). Ein Objekt dieses Typs steht für ein Verzeichnis im privaten, abgeschotteten Dateisystem einer Herkunft (Origin). Man bekommt es meist über FileSystemSync.root, nachdem man in einem Worker self.webkitRequestFileSystemSync() aufgerufen hat.
Die Schnittstelle erbt von EntrySync und damit die Eigenschaften name, fullPath, isFile, isDirectory und filesystem sowie die Methoden getMetadata(), moveTo(), copyTo(), toURL(), remove() und getParent(). Dazu kommen eigene, verzeichnisspezifische Methoden:
createReader()– gibt einenDirectoryReaderSynczurück, mit dem man den Inhalt des Verzeichnisses auflistet.getFile(path, options)– öffnet oder erstellt eine Datei und gibt einenFileEntrySynczurück.getDirectory(path, options)– öffnet oder erstellt ein Unterverzeichnis und gibt einenDirectoryEntrySynczurück.removeRecursively()– löscht das Verzeichnis samt Inhalt.
Weil alle Aufrufe blockieren, gibt es die API nur in Web Workern und nicht im Hauptthread. Fehler meldet sie nicht über Rückruffunktionen, sondern als Ausnahmen (DOMException, früher FileException), die man mit try...catch abfängt. In neuen Projekten sollte man sie nicht mehr einsetzen. Der Nachfolger ist das Origin Private File System (OPFS) der File System API mit FileSystemDirectoryHandle und FileSystemSyncAccessHandle.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $path Pflicht | string | Für getFile() und getDirectory(): absoluter Pfad oder Pfad relativ zu diesem Verzeichnis, z. B. "logs/heute.txt". |
|
| $options | { create?: boolean, exclusive?: boolean } | { create: false, exclusive: false } | Für getFile() und getDirectory(): Mit create: true wird der Eintrag angelegt, falls er fehlt. Mit zusätzlich exclusive: true gibt es eine Ausnahme, wenn der Eintrag schon existiert. |
Rückgabewert
DirectoryReaderSync (createReader()), FileEntrySync (getFile()), DirectoryEntrySync (getDirectory()) oder undefined (removeRecursively()).Beispiele
Wurzelverzeichnis im Worker holen und Unterordner anlegen
// worker.js – synchrone API gibt es nur in Workern
const requestFs = self.requestFileSystemSync || self.webkitRequestFileSystemSync;
try {
const fs = requestFs(self.TEMPORARY, 5 * 1024 * 1024); // 5 MB
const root = fs.root; // DirectoryEntrySync
const cache = root.getDirectory('cache', { create: true });
postMessage(`Verzeichnis: ${cache.fullPath}, isDirectory=${cache.isDirectory}`);
} catch (err) {
postMessage(`Fehler: ${err.name} – ${err.message}`);
}
Datei erstellen und Text hineinschreiben
// worker.js
const fs = self.webkitRequestFileSystemSync(self.TEMPORARY, 1024 * 1024);
const logs = fs.root.getDirectory('logs', { create: true });
// exclusive: true → Ausnahme, falls die Datei schon existiert
let fileEntry;
try {
fileEntry = logs.getFile('start.txt', { create: true, exclusive: true });
} catch (err) {
fileEntry = logs.getFile('start.txt'); // gibt es schon → einfach öffnen
}
const writer = fileEntry.createWriter(); // FileWriterSync
writer.seek(writer.length); // ans Ende springen
writer.write(new Blob([`Start: ${new Date().toISOString()}\n`], { type: 'text/plain' }));
postMessage(`${fileEntry.fullPath}: ${writer.length} Bytes`);
Verzeichnisinhalt auflisten und rekursiv löschen
// worker.js
const fs = self.webkitRequestFileSystemSync(self.TEMPORARY, 1024 * 1024);
const dir = fs.root.getDirectory('logs', { create: true });
// readEntries() liefert Einträge in Blöcken – so lange lesen, bis nichts mehr kommt
const reader = dir.createReader();
const entries = [];
let batch;
while ((batch = reader.readEntries()).length > 0) {
entries.push(...batch);
}
postMessage(entries.map((e) => `${e.isDirectory ? '[D]' : '[F]'} ${e.name}`).join('\n'));
// Ganzes Verzeichnis mit Inhalt entfernen
dir.removeRecursively();
postMessage('logs/ gelöscht');
Moderne Alternative: OPFS mit FileSystemSyncAccessHandle
// worker.js – funktioniert in allen aktuellen Browsern
const root = await navigator.storage.getDirectory();
const logs = await root.getDirectoryHandle('logs', { create: true });
const file = await logs.getFileHandle('start.txt', { create: true });
const handle = await file.createSyncAccessHandle(); // synchroner Zugriff im Worker
const data = new TextEncoder().encode('Hallo OPFS\n');
handle.write(data, { at: handle.getSize() });
handle.flush();
postMessage(`Größe: ${handle.getSize()} Bytes`);
handle.close();