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

<b>      var bb = new BlobBuilder();</b>

<b>      bb.append(contents);</b>

<b>      var blob = bb.getBlob();</b>

<b>      // Записать двоичный объект в файл</b>

<b>      writer.write(blob);</b>

<b>      writer.onerror = logerr; // Сообщить об ошибке в write()</b>

<b>      if (callback) // Если указана функция callback</b>

<b>        writer.onwrite = callback: // вызвать в случае успеха</b>

<b>    },</b>

<b>    logerr); // Сообщить об ошибке в createWriter()</b>

<b>  },</b>

<b>  logerr); // Сообщить об ошибке в getFile()</b>

<b>}</b>

<b>// Удаляет файл с указанным именем, вызывает callback по завершении операции,</b>

<b>function deleteFile(name, callback) {</b>

<b>  filesystem.root.getFile(name, {}, // Получить FileEntry по имени файла</b>

<b>  function(entry) { // Передать FileEntry сюда</b>

<b>                   entry.remove(callback, // Удалить файл</b>

<b>                   logerr);               // Или сообщить</b>

<b>                  },                      //об ошибке в remove()</b>

<b>  logerr): // Сообщить об ошибке в getFile()</b>

<b>}</b>

<b>// Создает новый каталог с указанным именем</b>

<b>function makeDirectory(name, callback) {</b>

<b>  filesystem.root.getDirectory(name, // Имя создаваемого каталога</b>

<b>                               { // Параметры</b>

<b>                                create: true, // Создать, если не сущ.</b>

<b>                                exclusive:true // Ошибка, если существует</b>

<b>                               },</b>

<b>                               callback, // Вызвать по завершении</b>

<b>                               logerr); </b>
<b> // Выводить любые ошибки</b>

<b>}</b>

<b>// Читает содержимое указанного каталога и передает его в виде массива строк</b>

<b>// указанной функции callback</b>

<b>function listFiles(path, callback) {</b>

<b>  // Если каталог не указан, получить содержимое корневого каталога.</b>

<b>  // Иначе отыскать каталог с указанным именем и вернуть список</b>

<b>  // с его содержимым (или сообщить об ошибке поиска),</b>

<b>  if (!path) getFiles(filesystem.root);</b>

<b>  else filesystem.root.getDirectory(path, {}, getFiles, logerr);</b>

<b>  function getFiles(dir) { // Эта функция используется выше</b>

<b>    var reader = dir.createReader(); // Объект DirectoryReader</b>

<b>    var list = []; // Для сохранения имен файлов</b>

<b>    reader.readEntries(handleEntries, // Передать функции ниже</b>

<b>                       logerr); // или сообщить об ошибке.</b>

<b>    // Чтение каталогов может превратиться в многоэтапный процесс.</b>

<b>    // Необходимо сохранять результаты вызовов readEntries(), пока не будет</b>

<b>    // получен пустой массив. На этом операция будет закончена,</b>

<b>    // и полный список можно будет передать функции callback,</b>

<b>    function handleEntries(entries) {</b>

<b>      if (entries.length == 0) callback(list); // Операция закончена</b>

<b>      else {</b>

<b>        // Иначе добавить эти записи в общий список и запросить</b>

<b>        // очередную порцию. Объект, подобный массиву, содержит</b>

<b>        // объекты FileEntry, и нам следует получить имя для каждого.</b>

<b>        for(var і = 0; і &lt; entries.length; i++) {</b>

<b>          var name = entries[i].name;              // Получить имя записи</b>

<b>          if (entries[i].isDirectory) name += &quot;/&quot;; // Пометить каталоги</b>

<b>          list.push(name);                         // Добавить в список</b>

<b>        }</b>

<b>        // Получить следующую порцию записей</b>

<b>        reader.readEntries(handleEntries, logerr);</b>

<b>      }</b>

<b>    }</b>

<b>  }</b>

<b>}</b>

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