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.
Добавить комментарий