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; і < entries.length; i++) {</b><b> var name = entries[i].name; // Получить имя записи</b><b> if (entries[i].isDirectory) name += "/"; // Пометить каталоги</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, но использует синхронный прикладной интерфейс, и потому получился намного короче.