Das private Dateisystem des Ursprungs bietet Zugriff auf eine spezielle Art von Datei, die in Bezug auf die Leistung optimiert ist, z. B. durch das Angebot von exklusivem In-Place-Schreibzugriff auf den Inhalt einer Datei. Entwickler können auf solche Dateien zugreifen, indem sie createSyncAccessHandle()
aufrufen. Diese Methode wird für FileSystemFileHandle
-Objekte bereitgestellt. Dieser Aufruf führt zu einem FileSystemSyncAccessHandle
.
FileSystemSyncAccessHandle
ist ein Dateiprimitiv, das einen leistungsstarken Zugriff auf lokale Dateien ermöglicht. Einer der Hauptanwendungsfälle ist das Portieren von C/C++-Code in Wasm. Asynchrone Aufrufe werden in Wasm jedoch noch nicht vollständig unterstützt und die Verwendung der Asyncify-Bibliothek als Alternative hat die Leistung erheblich beeinträchtigt. Wenn alle Methoden von FileSystemSyncAccessHandle
synchronisiert werden, entspricht dies der synchronen, POSIX-ähnlichen Datei-API, die von WASM-basierten Anwendungen erwartet wird. Dadurch wird die API ergonomischer und die Leistung wird erheblich gesteigert.
Das ist neu
FileSystemSyncAccessHandle
macht die folgenden Methoden verfügbar, die früher asynchron waren, seit Chromium 108 aber synchron sind.
truncate(newSize)
: Ändert die Größe der Datei, die dem Zugriffshandle zugeordnet ist, aufnewSize
Byte. WennnewSize
größer als die aktuelle Dateigröße ist, wird die Datei mit Null-Bytes aufgefüllt. Andernfalls wird die Datei gekürzt.getSize()
: Gibt die Größe der Datei zurück, die dem Zugriffshandle zugeordnet ist, in Byte.flush()
: Sorgt dafür, dass der Inhalt der Datei, die mit dem Zugriffshandle verknüpft ist, alle Änderungen enthält, die überwrite()
vorgenommen wurden.close()
: Leert das Zugriffshandle und schließt es dann. Wenn Sie ein Zugriffshandle schließen, werden alle weiteren Vorgänge dafür deaktiviert und die Sperre für den mit dem Zugriffshandle verknüpften Eintrag wird aufgehoben.
// In a `Worker`:
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('test', { create: true });
// `createSyncAccessHandle()` is still async.
const accessHandle = await fileHandle.createSyncAccessHandle();
// Both `read()` and `write()` were sync before.
accessHandle.read(/* ... */);
accessHandle.write(/* ... */);
// New: synchronous as of Chromium 108.
console.log(accessHandle.getSize());
accessHandle.truncate(123);
accessHandle.flush();
accessHandle.close();
Was muss ich tun?
Das Ändern von Methoden von asynchron zu synchron ist eine webbasierte Änderung mit potenziellen Problemen. Die Verwendung von await
in synchronen Methoden hat keine Auswirkungen, die Verwendung von Promise.then()
führt jedoch zu einem Fehler.
Wenn Sie einen then()
-Aufruf für das Ergebnis einer der zuvor asynchronen und jetzt synchronen Methoden verketten, müssen Sie Ihren Code ändern.
// (✅) This won't break, but you better remove the superfluous `await`:
await accessHandle.flush();
// ✅ Correct:
accessHandle.flush();
// ⛔️ This will break, and you need to restructure your code:
accessHandle.flush().then(/* Follow-up code */);
// ✅ Correct:
accessHandle.flush();
/* Follow-up code */
Weitere Informationen
- TAG-Überprüfung
- Spezifikation
- Spezifikationsproblem, das zur Änderung geführt hat
- ChromeStatus-Eintrag
- Chromium-Fehler