Sowohl die File System Access API als auch die Origin Private File System API ermöglichen es Entwicklern, auf Dateien und Verzeichnisse auf dem Gerät des Nutzers zuzugreifen. Mit ersterem können Entwickler im regulären, für Nutzer sichtbaren Dateisystem lesen und schreiben. Letzteres öffnet ein spezielles, für Nutzer ausgeblendetes Dateisystem, das für den Ursprung jeder Website privat ist und bestimmte Leistungsvorteile bietet. In beiden Fällen interagieren Entwickler über FileSystemHandle
-Objekte mit Dateien und Verzeichnissen, genauer gesagt FileSystemFileHandle
für Dateien und FileSystemDirectoryHandle
für Verzeichnisse. Bisher war es erforderlich, eine Art Abfrage durchzuführen und den lastModified
-Zeitstempel oder sogar den Dateiinhalt selbst zu vergleichen, um über Änderungen an einer Datei oder einem Verzeichnis in einem der Dateisysteme informiert zu werden.
Die File System Observer API, die seit Chrome 129 im Ursprungstest verfügbar ist, ändert das und ermöglicht es Entwicklern, automatisch benachrichtigt zu werden, wenn Änderungen auftreten. In diesem Leitfaden wird erläutert, wie die Funktion funktioniert und wie Sie sie ausprobieren können.
Anwendungsfälle
Verwenden Sie die File System Observer API in Apps, die sofort über mögliche Dateisystemänderungen informiert werden müssen.
- Webbasierte integrierte Entwicklungsumgebungen (IDEs), die eine Darstellung des Dateisystembaums eines Projekts zeigen.
- Apps, die Dateisystemänderungen mit einem Server synchronisieren. Beispiel: eine SQLite-Datenbankdatei.
- Apps, die den Haupt-Thread über Dateisystemänderungen von einem Worker oder einem anderen Tab benachrichtigen müssen.
- Apps, die ein Ressourcenverzeichnis beobachten, um beispielsweise Bilder automatisch zu optimieren.
- Anwendungen, die von Hot Reloading profitieren, z. B. HTML-basierte Foliensammlungen, bei denen ein Neuladen durch eine Dateiänderung ausgelöst wird.
Verwendung der File System Observer API
Funktionserkennung
Führen Sie einen Funktionstest wie im folgenden Beispiel aus, um zu prüfen, ob die File System Observer API unterstützt wird.
if ('FileSystemObserver' in self) {
// The File System Observer API is supported.
}
Dateisystem-Beobachter initialisieren
Initialisieren Sie einen Dateisystem-Beobachter, indem Sie new FileSystemObserver()
aufrufen und als Argument eine callback
-Funktion angeben.
const observer = new FileSystemObserver(callback);
Datei oder Verzeichnis beobachten
Wenn Sie eine Datei oder ein Verzeichnis beobachten möchten, rufen Sie die asynchrone observe()
-Methode der FileSystemObserver
-Instanz auf. Geben Sie dieser Methode den FileSystemHandle
der ausgewählten Datei oder des ausgewählten Verzeichnisses als Argument an. Wenn Sie ein Verzeichnis beobachten, gibt es ein optionales options
-Argument, mit dem Sie auswählen können, ob Sie über Änderungen am Verzeichnis rekursiv informiert werden möchten (d. h. für das Verzeichnis selbst und alle enthaltenen Unterverzeichnisse und Dateien). Standardmäßig wird nur das Verzeichnis selbst und die darin direkt enthaltenen Dateien beobachtet.
// Observe a file.
await observer.observe(fileHandle);
// Observe a directory.
await observer.observe(directoryHandle);
// Observe a directory recursively.
await observer.observe(directoryHandle, {recursive: true});
Die Callback-Funktion
Wenn Änderungen am Dateisystem auftreten, wird eine Callback-Funktion mit der Dateisystemänderung records
und dem observer
selbst als Argumenten aufgerufen. Mit dem observer
-Argument können Sie beispielsweise die Verbindung des Beobachters trennen (siehe Beobachtung des Dateisystems beenden), wenn alle Dateien gelöscht wurden, die Sie beobachten möchten.
const callback = (records, observer) => {
for (const record of records) {
console.log('Change detected', record);
}
};
Der Dateisystemänderungsdatensatz
Jeder Dateisystemänderungsdatensatz hat die folgende Struktur. Alle Felder sind schreibgeschützt.
root
(einFileSystemHandle
): Der an die FunktionFileSystemObserver.observe()
übergebene Handle.changedHandle
(einFileSystemHandle
): Der Handle, der von der Dateisystemänderung betroffen ist. Dieses Feld hat den Wertnull
für Ereignisse vom Typ"errored"
,"unknown"
und"disappeared"
. Verwenden SierelativePathComponents
, um herauszufinden, welche Datei oder welches Verzeichnis verschwunden ist.relativePathComponents
(einArray
): Der Pfad derchangedHandle
relativ zurroot
.type
(einString
): Die Art der Änderung. Folgende Typen sind möglich:"appeared"
: Die Datei oder das Verzeichnis wurde imroot
erstellt oder verschoben."disappeared"
: Die Datei oder das Verzeichnis wurde gelöscht oder aus demroot
verschoben."modified"
: Die Datei oder das Verzeichnis wurde geändert."moved"
: Die Datei oder das Verzeichnis wurde innerhalb desroot
verschoben."unknown"
: Dies bedeutet, dass null oder mehr Ereignisse verpasst wurden. Entwickler sollten daraufhin das beobachtete Verzeichnis abfragen."errored"
: Die Beobachtung ist nicht mehr gültig. In diesem Fall sollten Sie die Überwachung des Dateisystems beenden. Dieser Wert wird auch gesendet, wenn die maximale Anzahl der Beobachtungen pro Ursprung erreicht ist. Dieses Limit ist vom Betriebssystem abhängig und kann nicht im Voraus bestimmt werden. In diesem Fall kann die Website einen erneuten Versuch starten. Es gibt jedoch keine Garantie dafür, dass das Betriebssystem genügend Ressourcen freigegeben hat. Ein weiterer Fall, in dem dieser Wert gesendet wird, ist, wenn der beobachtete Handle (d. h. der Ursprung der Beobachtung) gelöscht oder verschoben wird. In diesem Fall wird zuerst das Ereignis"disappeared"
gesendet, gefolgt von einem Ereignis"errored"
, das angibt, dass die Beobachtung nicht mehr gültig ist. Dieses Ereignis wird außerdem gesendet, wenn die Berechtigung für das Verzeichnis oder den Dateihandle entfernt wird.
relativePathMovedFrom
(einArray
, optional): Der vorherige Standort eines verschobenen Ziehpunkts. Nur verfügbar, wenn dertype
"moved"
ist.
Beobachtung einer Datei oder eines Verzeichnisses beenden
Wenn Sie die Beobachtung einer FileSystemHandle
beenden möchten, rufen Sie die Methode unobserve()
auf und übergeben Sie dabei den Handle als Argument.
observer.unobserve(fileHandle);
Beobachtung des Dateisystems beenden
Wenn Sie die Beobachtung des Dateisystems beenden möchten, trennen Sie die Verbindung zur FileSystemObserver
-Instanz so:
observer.disconnect();
API testen
Wenn Sie die File System Observer API lokal testen möchten, setzen Sie das Flag #file-system-observer
in about:flags
. Wenn Sie die API mit echten Nutzern testen möchten, registrieren Sie sich für den Ursprungstest und folgen Sie der Anleitung im Leitfaden Chrome-Ursprungstests. Der Ursprungstest läuft von Chrome 129 (11. September 2024) bis Chrome 134 (26. Februar 2025).
Demo
In der eingebetteten Demo können Sie die File System Observer API in Aktion sehen. Sehen Sie sich den Quellcode an oder remixen Sie den Democode auf Glitch. In der Demo werden Dateien in einem beobachteten Verzeichnis zufällig erstellt, gelöscht oder geändert. Die Aktivitäten werden im oberen Teil des App-Fensters protokolliert. Die Änderungen werden dann im unteren Bereich des App-Fensters protokolliert. Wenn Sie diesen Artikel in einem Browser lesen, der die File System Observer API nicht unterstützt, sehen Sie sich einen Screenshot der Demo an.
Feedback
Wenn Sie Feedback zur Form der File System Observer API haben, kommentieren Sie Issue 123 im WHATWG/fs-Repository.
Relevante Links
- Erläuterung
- TAG-Überprüfung
- Mozilla-Standpunkt zu Standards
- Position von WebKit-Standards
- ChromeStatus
- Chromium-Fehler
Danksagungen
Dieses Dokument wurde von Daseul Lee, Nathan Memmott, Etienne Noël und Rachel Andrew geprüft.