API файловой системы
Безопасный контекст: Эта функция доступна только в безопасных контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.
Примечание: Эта функция доступна в рабочих потоках.
API файловой системы — с расширениями, предоставляемыми через API доступа к файловой системе для доступа к файлам в файловой системе устройства — позволяет выполнять чтение, запись и управление файлами.
Основные понятия и использование
Этот API позволяет взаимодействовать с файлами на локальном устройстве пользователя или на доступной пользователю сетевой файловой системе. Основные функциональные возможности этого API включают чтение файлов, запись или сохранение файлов и доступ к структуре каталогов.
Большая часть взаимодействия с файлами и каталогами выполняется через обработчики. Родительский класс FileSystemHandle помогает определить два дочерних класса: FileSystemFileHandle и FileSystemDirectoryHandle, для файлов и каталогов соответственно.
Обработчики представляют собой файл или каталог на системе пользователя. Сначала вы можете получить к ним доступ, показав пользователю выбор файла или каталога с помощью таких методов, как window.showOpenFilePicker() и window.showDirectoryPicker(). После вызова этого метода, появляется окно выбора файла, и пользователь выбирает файл или каталог. После успешного выбора возвращается обработчик.
Вы также можете получить доступ к обработчикам файлов через:
- Метод
DataTransferItem.getAsFileSystemHandle()интерфейса HTML Drag and Drop API. - API обработки файлов.
Каждый обработчик предоставляет свои функциональные возможности, и существуют некоторые различия в зависимости от используемого обработчика (см. раздел интерфейсы для получения подробной информации). Затем вы можете получить доступ к данным файла или информации (включая подкаталоги) выбранного каталога. Этот API открывает новые потенциальные функциональные возможности для веб-приложений. Тем не менее, при проектировании API безопасность была одним из важнейших вопросов, и доступ к данным файла/каталога запрещен, если пользователь его не разрешил (обратите внимание, что это не относится к частной файловой системе происхождения, так как она не отображается пользователю).
Примечание: Различные исключения, которые могут быть выброшены при использовании функций этого API, перечислены на соответствующих страницах, как определено в спецификации. Однако ситуация усложняется взаимодействием API и базовой операционной системы. Было предложено перечислить отображения ошибок в спецификации, что включает полезную связанную информацию.
Примечание: Объекты, основанные на FileSystemHandle, также могут быть сериализованы в базу данных IndexedDB или переданы через postMessage().
Частная файловая система происхождения
Частная файловая система происхождения (OPFS) — это конечная точка хранения, предоставляемая в рамках API файловой системы, которая является частной для источника страницы и не отображается пользователю, как обычная файловая система. Она обеспечивает доступ к специальному типу файла, который оптимизирован для производительности и позволяет выполнять запись на месте.
Подробные инструкции по использованию вы найдете в разделе Частная файловая система происхождения.
Сохранение файлов
- В случае асинхронных обработчиков используйте интерфейс
FileSystemWritableFileStream. После того, как данные, которые вы хотите сохранить, будут в форматеBlob, объектаString, строковой литералы илиbuffer, вы можете открыть поток и сохранить данные в файл. Это может быть существующий файл или новый файл. - В случае синхронного
FileSystemSyncAccessHandleзаписывайте изменения в файл, используя методwrite(). Вы также можете (необязательно) вызватьflush(), если вам необходимо выполнить операцию сохранения изменений на диске в определенное время (иначе вы можете позволить операционной системе обработать это, когда сочтет нужным, что обычно должно быть достаточно в большинстве случаев).
Интерфейсы
FileSystemHandle-
Объект, представляющий запись файла или каталога. Несколько обработчиков могут представлять одну и ту же запись. В основном вы не работаете с
FileSystemHandleнапрямую, а скорее с его дочерними интерфейсамиFileSystemFileHandleиFileSystemDirectoryHandle. FileSystemFileHandle-
Предоставляет обработчик для записи в файловую систему.
FileSystemDirectoryHandle-
Предоставляет обработчик для записи в каталог файловой системы.
FileSystemSyncAccessHandle-
Предоставляет синхронный обработчик для записи в файловую систему, который выполняет операции на месте с одним файлом на диске. Синхронный характер чтения и записи файлов позволяет добиться высокой производительности для критических методов в контекстах, где асинхронные операции сопряжены с высокими накладными расходами, например, WebAssembly. Этот класс доступен только внутри специализированных рабочих потоков для файлов в частной файловой системе происхождения.
FileSystemWritableFileStream-
Объект
WritableStreamс дополнительными удобными методами, работающий с одним файлом на диске.
Расширения других интерфейсов
Window.showDirectoryPicker()-
Отображает окно выбора каталога, которое позволяет пользователю выбрать каталог.
Window.showOpenFilePicker()-
Отображает окно выбора файла, которое позволяет пользователю выбрать один или несколько файлов.
Window.showSaveFilePicker()-
Отображает окно сохранения файла, которое позволяет пользователю сохранить файл.
DataTransferItem.getAsFileSystemHandle()-
Возвращает
FileSystemFileHandle, если перетаскиваемый элемент — это файл, илиFileSystemDirectoryHandle, если перетаскиваемый элемент — это каталог. StorageManager.getDirectory()-
Используется для получения ссылки на объект
FileSystemDirectoryHandle, обеспечивающий доступ к каталогу и его содержимому, хранящемуся в частной файловой системе происхождения. ВозвращаетPromise, который выполняется с объектомFileSystemDirectoryHandle.
Примеры
Доступ к файлам
Следующий код позволяет пользователю выбрать файл из окна выбора файла.
async function getFile() {
// Open file picker and destructure the result the first handle
const [fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
return file;
}
Следующая асинхронная функция отображает окно выбора файла и, после выбора файла, использует метод getFile() для извлечения содержимого.
const pickerOpts = {
types: [
{
description: "Images",
accept: {
"image/*": [".png", ".gif", ".jpeg", ".jpg"],
},
},
],
excludeAcceptAllOption: true,
multiple: false,
};
async function getTheFile() {
// Open file picker and destructure the result the first handle
const [fileHandle] = await window.showOpenFilePicker(pickerOpts);
// get file contents
const fileData = await fileHandle.getFile();
}
Доступ к каталогам
Следующий пример возвращает обработчик каталога с указанным именем. Если каталог не существует, он создается.
const dirName = "directoryToGetName";
// assuming we have a directory handle: 'currentDirHandle'
const subDir = currentDirHandle.getDirectoryHandle(dirName, { create: true });
Следующая асинхронная функция использует resolve() для поиска пути к выбранному файлу, относительно указанного обработчика каталога.
async function returnPathDirectories(directoryHandle) {
// Get a file handle by showing a file picker:
const [handle] = await self.showOpenFilePicker();
if (!handle) {
// User cancelled, or otherwise failed to open a file.
return;
}
// Check if handle exists inside our directory handle
const relativePaths = await directoryHandle.resolve(handle);
if (relativePaths === null) {
// Not inside directory handle
} else {
// relativePaths is an array of names, giving the relative path
for (const name of relativePaths) {
// log each entry
console.log(name);
}
}
}
Запись в файлы
Следующая асинхронная функция открывает окно сохранения файла, которое возвращает FileSystemFileHandle после выбора файла. Затем создается поток для записи с помощью метода FileSystemFileHandle.createWritable().
Затем пользовательский Blob записывается в поток, который затем закрывается.
async function saveFile() {
// create a new handle
const newHandle = await window.showSaveFilePicker();
// create a FileSystemWritableFileStream to write to
const writableStream = await newHandle.createWritable();
// write our file
await writableStream.write(imgBlob);
// close the file and write the contents to disk.
await writableStream.close();
}
Следующий пример показывает различные варианты параметров, которые можно передать в метод write().
// just pass in the data (no options)
writableStream.write(data);
// writes the data to the stream from the determined position
writableStream.write({ type: "write", position, data });
// updates the current file cursor offset to the position specified
writableStream.write({ type: "seek", position });
// resizes the file to be size bytes long
writableStream.write({ type: "truncate", size });
Синхронное чтение и запись файлов в OPFS
В этом примере синхронно считывается и записывается файл в исходную частную файловую систему.
Следующая асинхронная функция обработчика событий содержится внутри Web Worker. При получении сообщения с основного потока она:
- Создаёт синхронную ручку доступа к файлу.
- Получает размер файла и создаёт
ArrayBufferдля его хранения. - Считывает содержимое файла в буфер.
- Кодирует сообщение и записывает его в конец файла.
- Сохраняет изменения на диске и закрывает ручку доступа.
onmessage = async (e) => {
// retrieve message sent to work from main script
const message = e.data;
// Get handle to draft file in OPFS
const root = await navigator.storage.getDirectory();
const draftHandle = await root.getFileHandle("draft.txt", { create: true });
// Get sync access handle
const accessHandle = await draftHandle.createSyncAccessHandle();
// Get size of the file.
const fileSize = accessHandle.getSize();
// Read file content to a buffer.
const buffer = new DataView(new ArrayBuffer(fileSize));
const readBuffer = accessHandle.read(buffer, { at: 0 });
// Write the message to the end of the file.
const encoder = new TextEncoder();
const encodedMessage = encoder.encode(message);
const writeBuffer = accessHandle.write(encodedMessage, { at: readBuffer });
// Persist changes to disk.
accessHandle.flush();
// Always close FileSystemSyncAccessHandle if done.
accessHandle.close();
};
Примечание: В более ранних версиях спецификации close(), flush(), getSize() и truncate() были неэргономично определены как асинхронные методы. Это было исправлено, но некоторые браузеры всё ещё поддерживают асинхронные версии.
Спецификации
| Спецификация |
|---|
| Файловая система |
| Доступ к файловой системе |
Совместимость с браузерами
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
File_System_API |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
close |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
flush |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
getSize |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
read |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
truncate |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
write |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
File_System_API |
86 | 86 | 111 | 72 | Нет | 109 | 111 | 74 | Нет | 21.0 | 109 |
seek |
86 | 86 | 111 | 72 | Нет | 109 | 111 | 74 | Нет | 21.0 | 109 |
truncate |
86 | 86 | 111 | 72 | Нет | 109 | 111 | 74 | Нет | 21.0 | 109 |
write |
86 | 86 | 111 | 72 | Нет | 109 | 111 | 74 | Нет | 21.0 | 109 |
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
@@asyncIterator |
86 | 86 | 111 | 72 | 16.4 | 109 | 111 | 74 | 16.4 | 21.0 | 109 |
File_System_API |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
entries |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
getDirectoryHandle |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
getFileHandle |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
keys |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
removeEntry |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
resolve |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
values |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
File_System_API |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
createSyncAccessHandle |
102 | 102 | 111 | 88 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
createWritable |
86 | 86 | 111 | 72 | Нет | 109 | 111 | 74 | Нет | 21.0 | 109 |
getFile |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
| Рабочий стол | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
File_System_API |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
isSameEntry |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
kind |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
move |
Нет | Нет | 111 | Нет | 15.2 | Нет | 111 | Нет | 15.2 | Нет | Нет |
name |
86 | 86 | 111 | 72 | 15.2 | 109 | 111 | 74 | 15.2 | 21.0 | 109 |
queryPermission |
86 | 86 | Нет | 72 | Нет | 109 | Нет | 74 | Нет | 21.0 | 109 |
remove |
110 | 110 | Нет | 96 | Нет | 110 | Нет | 74 | Нет | 21.0 | 110 |
requestPermission |
86 | 86 | Нет | 72 | Нет | 109 | Нет | 74 | Нет | 21.0 | 109 |
api.FileSystemHandle
Таблицы BCD загружаются только в браузере
api.FileSystemFileHandle
Таблицы BCD загружаются только в браузере
api.FileSystemDirectoryHandle
Таблицы BCD загружаются только в браузере
api.FileSystemWritableFileStream
Таблицы BCD загружаются только в браузере
api.FileSystemSyncAccessHandle
Таблицы BCD загружаются только в браузере
См. также
END_OF_DOCUMENT_MARKER
© 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/File_System_API