FileSystemFileHandle: метод createWritable()
Ограниченное использование
Эта функция не относится к Baseline, так как она не работает во всех широко используемых браузерах.
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS) в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в Web Workers.
Метод createWritable() интерфейса FileSystemFileHandle создаёт поток FileSystemWritableFileStream, который можно использовать для записи в файл. Метод возвращает Promise, который разрешается в этот созданный поток.
Любые изменения, внесённые через поток, не будут отражены в файле, представленном обработчиком файла, пока поток не будет закрыт. Обычно это реализуется путём записи данных во временный файл и только затем заменой файла, представленного обработчиком файла, на временный файл, когда поток записи закрывается.
Синтаксис
createWritable() createWritable(options)
Параметры
optionsНеобязательно-
Объект со следующими свойствами:
keepExistingDataНеобязательно-
Boolean. Значение по умолчанию:false. Если установленоtrue, и файл существует, то сначала существующий файл копируется во временный файл. В противном случае временный файл создаётся пустым. modeНеобязательно Нестандартный-
Строка, определяющая режим блокировки для потока записи файла. Значение по умолчанию:
"siloed". Возможные значения:"exclusive"-
Только один
FileSystemWritableFileStreamписатель может быть открыт. Попытка открыть последующих писателей до закрытия первого писателя приведёт к исключениюNoModificationAllowedError. "siloed"-
Можно открыть несколько
FileSystemWritableFileStreamписателей одновременно, каждый со своим файлом-заменой, например, при использовании одного приложения в нескольких вкладках. Данные последнего открытого писателя будут записаны, поскольку данные сохраняются при закрытии каждого писателя.
Возвращаемое значение
A Promise, который разрешается в объект FileSystemWritableFileStream.
Исключения
-
NotAllowedErrorDOMException -
Выбрасывается, если
PermissionStatus.stateдля обработчика не равно'granted'в режимеreadwrite. -
NotFoundErrorDOMException -
Выбрасывается, если текущая запись не найдена.
-
NoModificationAllowedErrorDOMException -
Выбрасывается, если браузер не может заблокировать файл, связанный с файловым обработчиком. Это может произойти, если
modeустановлено вexclusiveи одновременно делается попытка открыть нескольких писателей. -
AbortErrorDOMException -
Выбрасывается, если проверка на вредоносные программы и проверка безопасного просмотра, определённые реализацией, завершилась неудачно.
Примеры
Базовое использование
Следующая асинхронная функция записывает заданное содержимое в файловый обработчик, а значит, и в диск.
async function writeFile(fileHandle, contents) {
// Create a FileSystemWritableFileStream to write to.
const writable = await fileHandle.createWritable();
// Write the contents of the file to the stream.
await writable.write(contents);
// Close the file and write the contents to disk.
await writable.close();
}
Расширенное использование с параметрами
Наш пример createWritable() тест режима предоставляет <button> для выбора файла для записи, текстовое поле <input>, в которое можно ввести текст для записи в файл, и вторую кнопку <button> для записи текста в файл.
В демонстрации выше, попробуйте выбрать текстовый файл в вашей файловой системе (или ввести новое имя файла), введите некоторый текст в поле ввода и запишите текст в файл. Откройте файл в вашей файловой системе, чтобы проверить, была ли запись успешной.
Также попробуйте открыть страницу в двух вкладках браузера одновременно. Выберите файл для записи в первой вкладке, а затем немедленно попробуйте выбрать тот же файл для записи во второй вкладке. Вы получите сообщение об ошибке, так как мы установили mode: "exclusive" в вызове createWritable().
Ниже мы рассмотрим код.
HTML
Два элемента <button> и текстовое поле <input> выглядят так:
<ol>
<li>
Select a file to write to: <button class="select">Select file</button>
</li>
<li>
<label for="file-text">Enter text to write to the file:</label>
<input type="text" id="file-text" name="file-text" disabled />
</li>
<li>
Write your text to the file:
<button class="write" disabled>Write text</button>
</li>
</ol>
Поле ввода текста и кнопка «Записать текст» изначально отключены с помощью атрибута disabled — они не должны использоваться, пока пользователь не выберет файл для записи.
JavaScript
Начнём с получения ссылок на кнопку выбора файла, кнопку «Записать текст» и поле ввода текста. Мы также объявляем глобальную переменную writableStream, которая будет хранить ссылку на поток записи для записи текста в файл после его создания. Изначально она установлена в null.
const selectBtn = document.querySelector(".select");
const writeBtn = document.querySelector(".write");
const fileText = document.querySelector("#file-text");
let writableStream = null;
Далее, создадим асинхронную функцию под названием selectFile(), которую мы вызовем при нажатии кнопки выбора. Она использует метод Window.showSaveFilePicker() для отображения диалога выбора файла у пользователя и создания файлового обработчика выбранного файла. Для этого обработчика мы вызываем метод createWritable() для создания потока записи для записи текста в выбранный файл. Если вызов завершается ошибкой, мы записываем ошибку в консоль.
Мы передаём createWritable() объект параметров, содержащий следующие параметры:
-
keepExistingData: true: Если выбранный файл уже существует, то содержимое файла копируется во временный файл перед началом записи. -
mode: "exclusive": Указывает, что только один писатель может быть открыт для файлового обработчика одновременно. Если другой пользователь загрузит пример и попытается выбрать файл, он получит сообщение об ошибке.
Наконец, мы активируем поле ввода и кнопку «Записать текст», так как они нужны для следующего шага, и деактивируем кнопку «Выбрать файл» (на данный момент это не требуется).
async function selectFile() {
// Create a new handle
const handle = await window.showSaveFilePicker();
// Create a FileSystemWritableFileStream to write to
try {
writableStream = await handle.createWritable({
keepExistingData: true,
mode: "exclusive",
});
} catch (e) {
if (e.name === "NoModificationAllowedError") {
console.log(
`You can't access that file right now; someone else is trying to modify it. Try again later.`,
);
} else {
console.log(e.message);
}
}
// Enable text field and write button, disable select button
fileText.disabled = false;
writeBtn.disabled = false;
selectBtn.disabled = true;
}
Наша следующая функция, writeFile(), записывает текст, введённый в поле ввода, в выбранный файл с помощью FileSystemWritableFileStream.write(), затем очищает поле ввода. Затем мы закрываем поток записи с помощью WritableStream.close() и сбрасываем демонстрацию, чтобы её можно было запустить снова — состояния элементов управления возвращаются в исходное состояние, и переменная writableStream устанавливается обратно в null.
async function writeFile() {
// Write text to our file and empty out the text field
await writableStream.write(fileText.value);
fileText.value = "";
// Close the file and write the contents to disk.
await writableStream.close();
// Disable text field and write button, enable select button
fileText.disabled = true;
writeBtn.disabled = true;
selectBtn.disabled = false;
// Set writableStream back to null
writableStream = null;
}
Для запуска демонстрации мы устанавливаем обработчики событий на кнопках, чтобы при нажатии на каждую из них выполнялась соответствующая функция.
selectBtn.addEventListener("click", selectFile);
writeBtn.addEventListener("click", writeFile);
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
createWritable |
86 | 86 | 111 | 72 | Нет | 109 | 111 | 74 | Нет | 21.0 | 109 |
mode |
121 | 121 | Нет | 107 | Нет | 121 | Нет | 81 | Нет | 25.0 | Нет |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/FileSystemFileHandle/createWritable