FileSystem API

FileSystem API — это уже совершенно новый уровень работы с файлами.

Со способами хранить информацию на стороне клиента мы уже сталкивались — это и Web Storage, и webSQL/IndexedDB и даже в определенном смысле AppCache. Операции с файлами и файловой системой — тоже один из этих способов, но, как можно понять, принципиально другого назначения. С помощью данного API мы сможем оперировать с бинарными объектами больших размеров и предоставлять к ним доступ приложений вне браузера.

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

Window. requestFileSystem(type, size, onInitFs, onError):

Где type — тип хранения файловых ресурсов. Может принимать значения TEMPORARY (ресурсы могут быть удалены при нехватке свободного места) и PERSISTENT (данные удаляются топлько явным образом — пользователем или приложением); size — размер файловой системы (в байтах); onInitFs — функция, вызываемая при удачном создании файловой системы. Получа ет аргумент — объект FileSystem; onError — функция, вызываемая при ошибке. Аргумент — объект FileError.

Вот с FileError лучше разобраться подробней. Вместо подробного его описания напишем сразу реализацию функции errorCallback:

Function onError(error) { var msg = »; switch (error. code) {

Case FileError. ABORT_ERR: msg = ‘Операция прервана’;

Break;

Case FileError. NOT_READABLE_ERR: msg = ‘Файл нечитаем’;

Break;

Case FileError. ENCODING_ERR: msg = ‘Проблемы с кодировкой’;

Break;

Case FileError. QUOTA_EXCEEDED_ERR: msg = ‘Превышен объем хранилища’; break;

Case FileError. NOT_FOUND_ERR: msg = ‘Файл не найден’; break;

Case FileError. SECURITY_ERR:

Msg = ‘Небезопасная или недопустимая операция’; break;

Case FileError. NO_MODIFICATION_ALLOWED_ERR: msg = ‘Невозможно изменить файл’; break;

Case FileError. INVALID_MODIFICATION_ERR: msg = ‘Ошибка изменения файла’; break;

Case FileError. INVALID_STATE_ERR: msg = ‘Ошибка состояния’; break;

Case FileError. SYNTAX_ERR: msg = ‘Ошибка синтаксиса’; break;

Case FileError. TYPE_MISMATCH_ERR: msg = ‘Неприемлемый тип файла’; break;

Case FileError. PATH_EXISTS_ERR:

Msg = ‘Файл уже существует’; break: default:

Msg = ‘Неизвестная ошибка’; break:

};

Alert(msg):

}

Все, к ошибкам больше не возвращаемся. Теперь будем творить обещанные операции с файловой системой.

В вышеописанном примере функция onInitFs(), как уже говорилось, получает объект FileSystem, соответствующий инициированной файловой системе. Создание файла будет проходить следующим образом:

Function onInitFs(fs) {

Fs. root. getFile(‘log. txt’, {create: true}, function(fe) { alert(fe. isFile):

}, onError):

Здесь метод geFile() создает в корне созданной файловой системы (а других папок еще не существует) файл log. txt. Анонимная функция обратного вызова здесь принимает в качестве аргументов объект (интерфейс) FileEntry, имеющий все методы и свойства обычного файла. Простенькое исследование:

Var keys = Object. keys(fe); for (var i = 0, key; key = keys[i]; ++i) { alert(key+” — ”+fe[key]);

}

Даст следующий минимальный набор:

— isFile — true

— Filesystem — [object DOMFileSystem]

— fullPath — /log. txt

— name — log. txt

— isDirectpry — false

Теперь запишем что-нибудь в созданный файл:

Fs. root. getFile(‘log. txt’, {}, function(fe) { fe. createWriter(function(fw) {

Fw. onwrite = function(e) { alert(‘Запись завершена’);

};

Fw. onerror = function(e) {

Alert(‘Write failed: ‘ + e. toString());

};

Var blob = new BlobBuilder(); blob. append(‘FilesystemAPI work!’); fw. write(bloS. getBlob(‘text/plain’));

}, onError):

}, onError):

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

Чтение осуществляется проще. Используем уже знакомый нам FileReader:

Fe. file(function(file) {

Var reader = new SileReader(); alert(file);

Reader. onloadend = function(e) { alert(this. result);

}

Reader. readAsText(file):

});

Теперь, когда мы из браузера произвели запись и выполнили чтение из святая святых — файловой системы компьютера пользователя, самое время поговорить о безопасности новой технологии. Впрочем, тут все довольно стандартно и уже опробовано на подходе к работе с ресурсами в некоторых RIA, например Google Native Client — реализована концепция «песочницы», при которой браузер получает доступ только к тем файловым ресурсам, которые сам же и создал. Соответственно, и процессы операционной системы, в общем случае, не имеют доступа к созданным браузером файлам и папкам/ директориям. Безопасна ли подобная модель? Время покажет, а пока продолжим.

Для полноты картины удалим файл:

Fs. root. getFile(‘log. txt’, {create: false}, function(TileEntry) {

FileEntry. remove(function() { alert(‘Файл удален’);

}, errorHandler):

}, errorHandler);

Теперь попробуем сотворить то же с директориями:

Function onInitFs(fs) {

Fs. root. getDirectory(‘MyDir’, {create: true}, function(de) {

Alert(‘Директория создана’);

},

OnError)

}

De здесь — объект DirectoryEntry, реализующий, как и FileEntry, интерфейс Entry. Продемонстрируем и аналог FileReader — Direc-toryReader.

Сначала создадим несколько файлов в новой директории:

Fs. root. getFile(‘/MyDir/log2.txt’, {create: true}, function(fn) { }, onError);

Теперь считаем содержимое:

Fs. root. getDirectory(‘MyDir’, {}, function(de) {

Var dirReader = de. createReader(); dirReader. readEntries(function(results) { for(i =0; results[i];i++){ alert(results[i].name):

}

}):

},

OnError):

Тут results — массив, элементы которого — объекты FileEntry. Наверное, многих обрадует новость о том, что, помимо метода remove(), у DirectoryEntry есть еще метод т emoveRecursively. Есть

Также методы для перемещения и переименования каталогов — moveTo.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *