Start · Sprachen · JavaScript · Referenz · DirectoryEntrySync

DirectoryEntrySync

Schnittstelle

Die synchrone Schnittstelle <code>DirectoryEntrySync</code> steht für ein Verzeichnis im sandboxed Dateisystem und erlaubt, darin Dateien und Unterverzeichnisse anzulegen, zu lesen und zu löschen.

seit JavaScript Nicht standardisiert, veraltet – nur Chromium-Brow deprecated seit ja Kategorie: webapi

Signatur

interface DirectoryEntrySync extends EntrySync

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 einen DirectoryReaderSync zurück, mit dem man den Inhalt des Verzeichnisses auflistet.
  • getFile(path, options) – öffnet oder erstellt eine Datei und gibt einen FileEntrySync zurück.
  • getDirectory(path, options) – öffnet oder erstellt ein Unterverzeichnis und gibt einen DirectoryEntrySync zurü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

Typ
DirectoryEntrySync
Beschreibung
Ein Objekt, das ein Verzeichnis darstellt. Die Methoden liefern 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}`);
}
Verzeichnis: /cache, isDirectory=true

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`);
/logs/start.txt: 32 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');
[F] start.txt 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();
Größe: 11 Bytes