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

<b>      reader.onload = function() { // Получить содержимое файла</b>

<b>        console.log(reader.result);</b>

<b>      };</b>

<b>    });</b>

<b>  });</b>

<b>});</b>

В примере 22.13 демонстрируется более полное решение. В нем показано, как использовать асинхронный прикладной интерфейс для чтения, записи и удаления файлов, создания каталогов и получения списков их содержимого.

Пример 22.13. Использование асинхронного прикладного интерфейса доступа к файловой системе

<b>/*</b>

<b>* Следующие функции были протестированы в Google Chrome 10.0 dev.</b>

<b>* Вам может потребоваться запустить Chrome со следующими ключами:</b>

<b>* --unlimited-quota-for-files : разрешает доступ к файловой системе</b>

<b>* —allow-file-access-from-files : разрешает тестировать из URL file://</b>

<b>*/</b>

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

<b>// обратного вызова для обработки ошибок.</b>

<b>// Следующая функция просто выводит сообщение об ошибке,</b>

<b>function logerr(e) { console.log(e); }</b>

<b>// requestFileSystem() возвращает локальную файловую систему, доступную</b>

<b>// только приложениям с указанным происхождением. Приложение может читать</b>

<b>// и писать файлы в ней, но не может получить доступ к остальной файловой системе,</b>

<b>var filesystem; // Предполагается, что эта переменная будет инициализирована</b>

<b>                // перед вызовом функции, объявленной ниже.</b>

<b>requestFileSystem(PERSISTENT, // Или TEMPORARY для кэширования файлов 10*1024*1024,</b>

<b>                              // Требуется 10 Мбайт</b>

<b>                  function(fs) { // После выполнения вызвать эту функцию</b>

<b>                    filesystem = fs; // Просто сохранить ссылку на файловую систему</b>

<b>                  },                </b>
<b> //в глобальной переменной,</b>

<b>                  logerr); // Вызвать эту функцию в случае ошибки</b>

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

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

<b>  // Вызвать getFile(), чтобы получить объект FileEntry для файла</b>

<b>  // с указанным именем</b>

<b>  filesystem.root.getFile(path, {}, function(entry) {</b>

<b>    // При вызове этой функции передается объект FileEntry, соответствующий файлу.</b>

<b>    // Теперь следует вызвать метод FileEntry.file(), чтобы получить объект File</b>

<b>    entry.file(function(file) { // Вызвать с объектом File</b>

<b>      var reader = new FileReader(); // Создать объект FileReader</b>

<b>      reader.readAsText(file);       // И прочитать файл</b>

<b>      reader.onload = function() {   // В случае успешного чтения</b>

<b>        callback(reader.result);     // Передать данные функции callback</b>

<b>      }</b>

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

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

<b>  },</b>

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

<b>}</b>

<b>// Добавляет указанное содержимое в конец файла с указанным именем, создает новый файл,</b>

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

<b>function appendToFile(path, contents, callback) {</b>

<b>  // filesystem.root - это корневой каталог,</b>

<b>  filesystem.root.getFile( // Получить объект FileEntry</b>

<b>  path,                    // Имя и путь к требуемому файлу</b>

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

<b>  function(entry) { // Вызвать эту функцию, когда файл будет найден</b>

<b>    entry.createWriter( // Создать для файла объект FileWriter</b>

<b>    function(writeг) { // Вызвать эту функцию после создания</b>

<b>      // По умолчанию запись производится в начало файла.</b>

<b>      // Нам же требуется выполнить запись в конец файла</b>

<b>      writer.seek(writer.length); // Переместиться в конец файла</b>

<b>      // Преобразовать содержимое файла в объект Blob. Аргумент contents</b>

<b>      // может быть строкой, объектом Blob или объектом ArrayBuffer.</b>