Spec-Zone.ru › Web APIs

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
END_OF_DOCUMENT_MARKER
Рабочий стол Мобильные устройства
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
  • API доступа к файловой системе: упрощение доступа к локальным файлам
  • Частная файловая система происхождения

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API