浏览器给虚拟文件系统提供了两种类型的存储空间:临时的和持久性的。临时的存储空间是由浏览器自动分配的,但可能被浏览器回收;持久性的存储空间需要显示的申请,申请时浏览器会给用户一提示,需要用户进行确认。持久性的存储空间是 WebApp 自己管理,浏览器不会回收,也不会清除内容。持久性的存储空间大小是通过配额来管理的,首次申请时会一个初始的配额,配额用完需要再次申请。
虚拟的文件系统是运行在沙盒中。不同 WebApp 的虚拟文件系统是互相隔离的,虚拟文件系统与本地文件系统也是互相隔离的。
File System API 提供了一组文件与文件夹的操作接口,有同步和异步两个版本,可满足不同的使用场景。下面通过一个文件创建、读、写的例子,演示下简单的功能与用法。
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
//请求临时文件的存储空间
if (window.requestFileSystem) {
window.requestFileSystem(window.TEMPORARY, 5*1024*1024, initFS, errorHandler);
}else{
alert('Sorry! Your browser doesn\'t support the FileSystem API');
}
//请求成功回调
function initFS(fs){
//在根目录下打开log.txt文件,如果不存在就创建
//fs就是成功返回的文件系统对象,fs.root代表根目录
fs.root.getFile('log.txt', {create: true}, function(fileEntry) {
//fileEntry是返回的一个文件对象,代表打开的文件
//向文件写入指定内容
writeFile(fileEntry);
//将写入的内容又读出来,显示在页面上
readFile(fileEntry);
}, errorHandler);
}
//读取文件内容
function readFile(fileEntry)
{
console.log('readFile');
// Get a File object representing the file,
// then use FileReader to read its contents.
fileEntry.file(function(file) {
console.log('createReader');
var reader = new FileReader();
reader.onloadend = function(e) {
console.log('onloadend');
var txtArea = document.createElement('textarea');
txtArea.value = this.result;
document.body.appendChild(txtArea);
};
reader.readAsText(file);
}, errorHandler);
}
//向文件写入指定内容
function writeFile(fileEntry)
{
console.log('writeFile');
// Create a FileWriter object for our FileEntry (log.txt).
fileEntry.createWriter(function(fileWriter) {
console.log('createWriter');
fileWriter.onwriteend = function(e) {
console.log('Write completed');
};
fileWriter.onerror = function(e) {
console.log('Write failed: ' + e.toString());
};
// Create a new Blob and write it to log.txt.
var blob = new Blob(['Hello, World!'], {type: 'text/plain'});
fileWriter.write(blob);
}, errorHandler);
}
function errorHandler(err){
var msg = 'An error occured: ' + err;
console.log(msg);
};