Частная файловая система происхождения обеспечивает доступ к файлам особого типа, которые высоко оптимизированы с точки зрения производительности, например, предлагая эксклюзивный доступ на запись к содержимому файла на месте. Разработчики могут получить доступ к таким файлам, вызвав createSyncAccessHandle()
— метод, предоставляемый объектам FileSystemFileHandle
. Результатом этого вызова является FileSystemSyncAccessHandle
.
FileSystemSyncAccessHandle
— файловый примитив, обеспечивающий эффективный доступ к локальным файлам. Одним из основных вариантов его использования является перенос приложений кода C/C++ на Wasm; однако асинхронные вызовы еще не полностью поддерживаются в Wasm, а использование библиотеки Asyncify в качестве альтернативы существенно снижает производительность. Синхронизация всех методов FileSystemSyncAccessHandle
соответствует ожидаемому синхронному POSIX-подобному файловому API на основе Wasm; делая API более эргономичным, обеспечивая при этом существенный прирост производительности.
Что нового?
FileSystemSyncAccessHandle
предоставляет следующие методы, которые раньше были асинхронными, но стали синхронными с Chromium 108 .
-
truncate(newSize)
: изменяет размер файла, связанного с дескриптором доступа, до длиныnewSize
в байтах. ЕслиnewSize
больше текущего размера файла, он дополняет файл нулевыми байтами; в противном случае файл будет обрезан. -
getSize()
: возвращает размер файла, связанного с дескриптором доступа, в байтах. -
flush()
: гарантирует, что содержимое файла, связанного с дескриптором доступа, содержит все изменения, сделанные с помощьюwrite()
. -
close()
: сбрасывает дескриптор доступа, а затем закрывает его. Закрытие дескриптора доступа отключает любые дальнейшие операции с ним и снимает блокировку записи, связанной с дескриптором доступа.
// 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();
Что мне нужно сделать?
Обратите внимание, что изменение методов с асинхронных на синхронные — это изменение, доступное через Интернет, которое может привести к поломке. Хотя использование await
в синхронных методах не является операцией, любое использование Promise.then()
приведет к сбою. Если вы связываете вызов then()
с результатом любого из ранее асинхронных, а теперь синхронных методов, вам необходимо изменить свой код.
// (✅) 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 */
Ссылки по теме
- Обзор тегов
- Спецификация
- Проблема со спецификацией (которая привела к изменению)
- Запись ChromeStatus
- Ошибка хрома