JavaScript. Подробное руководство, 6-е издание, стр. 394

Работа с файлами в локальной файловой системе является многоэтапным процессом. Прежде всего, необходимо получить объект, представляющий саму файловую систему. Сделать это можно с помощью синхронного прикладного интерфейса в фоновом потоке или асинхронного - в основном потоке выполнения:

<b>// Метод синхронного получения файловой системы. Принимает параметры,</b>

<b>// определяющие срок существования файловой системы и ее размер.</b>

<b>// Возвращает объект файловой системы или возбуждает исключение,</b>

<b>var fs = requestFileSystemSync(PERSISTENT, 1024*1024);</b>

<b>// Асинхронная версия принимает функции обратного вызова для обработки</b>

<b>// успешного или неудачного создания файловой системы</b>

<b>requestFileSystem(TEMPORARY,     // срок существования</b>

<b>                   50*1024*1024, // размер: 50 Мбайт</b>

<b>                  function(fs) { // будет вызвана с объектом файловой системы</b>

<b>                                 // Здесь используется объект fs</b>

<b>                  },</b>

<b>                  function(e) { // будет вызвана с объектом ошибки</b>

<b>                    console.log(е); // Или как-то иначе обработать ошибку</b>

<b>});</b>

В обеих версиях прикладного интерфейса, синхронной и асинхронной, указываются срок существования и желаемый размер файловой системы. Файловая система, срок существования которой определяется константой

<b>PERSISTENT</b>
(постоянная), подходит для веб-приложений, которым требуется хранить пользовательские данные постоянно. Броузер не будет удалять эту файловую систему, пока пользователь явно не потребует этого. Файловая система, срок существования которой определяется константой
<b>TEMPORARY</b>
(временная), подходит для веб-приложений, которые требуют кэшировать данные, но также сохраняют работоспособность и после того, как веб-броузер удалит файловую систему. Размер файловой системы определяется в байтах и должен быть равен разумному верхнему пределу объема данных, которые потребуется сохранять. Броузер может ограничивать этот размер, устанавливая квоты.

Доступность файловой системы определяется происхождением создавшего ее документа. Все документы или веб-приложения с общим происхождением (хост, порт и протокол) будут совместно использовать одну и ту же файловую систему. Два документа или приложения с разным происхождением будут пользоваться совершенно разными и никак не связанными между собой файловыми системами. Кроме того, файловая система веб-приложения отделена от остальных файлов на жестком диске пользователя: веб-приложения не имеют никакой возможности «вырваться» за пределы локального корневого каталога или как-то иначе получить доступ к произвольным файлам.

Обратите внимание, что в именах этих функций присутствует слово «request» (запросить). Когда приложение вызывает одну из этих функций в первый раз, броузер может запросить разрешение у пользователя, прежде чем создать файловую систему и разрешить доступ к ней. [59]

После получения доступа все последующие вызовы метода request будут просто возвращать объект, представляющий уже имеющуюся локальную файловую систему.

Объект файловой системы, полученный одним из методов, представленных выше, имеет свойство

<b>root</b>
, ссылающееся на корневой каталог файловой системы. Это объект
<b>DirectoryEntry</b>
, и он может иметь вложенные каталоги, представленные собственными объектами
<b>DirectoryEntry</b>
. Каждый каталог в файловой системе может содержать файлы, представленные объектами
<b>FileEntry</b>
. Объект
<b>DirectoryEntry</b>
определяет методы для получения объектов
<b>DirectoryEntry</b>
и
<b>FileEntry</b>
по пути в файловой системе (они могут создавать новые каталоги и файлы, если указанное имя не существует). Объект
<b>DirectoryEntry</b>
также определяет фабричный метод
<b>createReader(),</b>
возвращающий объект
<b>DirectoryReader</b>
, который позволяет получить список содержимого каталога.

Класс

<b>FileEntry</b>
определяет метод для получения объекта
<b>File</b>
(двоичный объект
<b>Blob</b>
), представляющий содержимое файла. Получив этот объект, его содержимое можно прочитать с помощью объекта
<b>FileReader</b>
(как показано в разделе 22.6.5). Объект
<b>FileEntry</b>
определяет еще один метод, возвращающий объект
<b>FileWriter</b>
, который можно использовать для записи в файл.

Операции чтения и записи с использованием этого прикладного интерфейса представляют собой многоэтапный процесс. Прежде всего, необходимо получить объект файловой системы. Затем, используя свойство root этого объекта, необходимо отыскать (и при необходимости создать) объект

<b>FileEntry</b>
, представляющий требуемый файл. Затем с помощью объекта
<b>FileEntry</b>
нужно получить объект File или
<b>FileWriter</b>
для выполнения операции чтения или записи. Этот процесс становится особенно сложным при использовании асинхронного прикладного интерфейса:

<b>// Читает текстовый файл &quot;hello.txt&quot; и выводит его содержимое. При использовании</b>

<b>// асинхронного прикладного интерфейса глубина вложенности функций достигает</b>

<b>// четырех уровней. Этот пример не включает определения функций обработки ошибок.</b>

<b>requestFileSystem(PERSISTENT, 10*1024*1024, function(fs) { // Получить объект ФС </b>

<b>  fs.root.getFile(&quot;hello.txt”, {}, function(entry) { // Получить FileEntry</b>

<b>    entry.file(function(file) { // Получить File</b>

<b>      var reader = new FileReader();</b>

<b>      reader.readAsText(file);</b>