// 这里使用的大部分异步函数都接受一个可选的错误回调函数
// 这里的回调函数只是简单地将错误输出
function logerr(e){console.log(e);}
// requestFileSystem()方法创建一个沙箱环境中的本地文件系统
// 并且只有同源的应用才能访问
// 可以在该文件系统中进行文件读写但是只能限定在该沙箱
// 不能访问其他的文件系统
var filesystem;
requestFileSystem(PERSISTENT,
10*1024*1024,
function(fs){
filesystem = fs;
},
logerr);
// 以文本形式读取指定文件的内容,并将它们传递给回调函数
function readTextFile(path,callback){
// 根据指定的文件名,调用getFile获取相应的FileEntry对象
filesystem.root.getFile(path,{},function(entry){
// 使用FileEntry调用此方法来获得文件
// 现在调用FileEntry.file方法获取File对象
entry.file(function(file){ //file就表示File对象
var reader = new FileReader(); //创建一个FileReader对象
reader.readAsText(file);
reader.onload = function(){ //读取文件
callback(reader.result); //成功时
}
reader.onerror = logerr; //记录调用readAsText()时发生的错误
},logerr) //记录调用file()方法时发生的错误
},
logerr);
}
// 将指定内容添加到指定路径的文件中,
// 如果指定的路径文件不存在就用当前文件名创建一个新的文件
// 完成之后,调用回调函数
function appendToFild(path,contents,callback){
// filesystem.root指根目录
filesystem.root.getFile( //获取FileEntry对象
path, //想要获取的文件的名字和路径
{create:true}, //不存在就创建
function(entry){ //完成以后调用此函数
entry.createWriter( //给该文件创建一个FileWriter对象
function(writer){ //创建完成后调用此函数
// 默认情况下,从文件最后开始写
// 这里指定从文件最后开始写
writer.seek(writer.length); //移动到文件最后
// 将文件内容转换成Blob
// contents参数可以是字符串、blob或者ArrayBuffer
var bb = new BlobBuilder()
bb.append(contents);
var blob = bb.getBlob();
//现在将该Blob写入到文件中
writer.writer(blob);
writer.onerror = logerr; //记录调用writer()方法时发生的错误
if(callback) //如果有回调函数
writer.onerror = logerr; //成功的时候调用
},
logerr); //记录调用createWriter()方法时发生的错误
},logerr); //记录调用getFile()方法时发生的错误
}
//删除指定的文件,完成后调用指定的回调函数
function deleteFile(name,callback){
filesystem.root.getFile(name,{}, //根据指定的名字获取相应的FileEntry对象
function(entry){ //entry就是该FileEntry对象
entry.remove(callback, //删除FileEntry对象
logerr); //或者记录调用remove()方法时发生
}, //的错误
logerr); //记录调用getFile()方法时发生的错误
}
//根据指定的名字创建新的目录
function makeDirectory(name,callback){
filesystem.root.getDirectory(name, //要创建的目录的名字
{ //选项
create:true, //如果不存在,则创建
exclusive:true //如果存在,则保错
},
callback,
logerr);
}
//读取指定目录的内容,并以字符串数组的形式将内容传递给指定的回调函数
function listFiles(path, callback) {
//如果指定的内容不存在,则列出根目录
//否则,根据名字查找目录并将目录内容列出来(或者如果发生错误就记录错误)
if (!path) getFiles(filesystem. root);
else filesystem.root.getDirectory(path,{},getFiles,logerr);
function getFiles(dir) { //此方法在之前也使用过
var reader = dir. createReader(); //一个DirectoryReader对象
var list = []; //用来存储文件名
reader.readEntries(handleEntries, //将每项都传递给下面的函数
logerr); //或者记录错误
//读取目录可以分成很多步
//必须一直调用readEntries ()方法直到获取到空数组为止
//完成之后可以将整个列表传递给回调函数
function handleEntries (entries) {
if (entries.length=0) callback(list); //完成
else {
//否则,将这些项添加到列表中,并继续读取
//此类数组对象包含FileEntry对象
//这里需要挨个获取它们的名字
for(var i = 0; i < entries.length; i++) {
var name = entries[i] .name;
//获取名字
if (entries[i].isDirectory) name += "/"; //标记目录
list. push(name);
//添加到列表中
//获取下一批项
reader .readEntries (handleEntries, logerr);
}
}
}
}
}
同步文件系统API
// 在Worker线程中使用同步API实现的文件系统工具函数
console.log(exports)
var filesystem = requestFileSystemSync(PERSISTENT,10*1024*1024);
function readTextFile(name){
// 从根DirectoryEntry中获取FileEntry对象,再从FileEntry中获取File
var file = filesystem.root.getFile(name).file();
// 使用同步FileReaderAPI读取
return new FileReaderSync().readAsText(file);
}
function appendToFile(name,contents){
//从根DirectoryEntry中获取FileEntry对象,再从FileEntry中获取FileWriter
var writer = filesystem.root.getFile(name,{create:true}).createWriter();
writer.seek(writer.length);//从文件开始到最后
var bb = new BlobBuilder()//将文件内容构造进blob
bb.append(contents);
writer.write(bb.getBlob());//将blob写入文件中
}
function deleteFile(name){
filesystem.root.getFile(name).remove();
}
function makeDirectory(name){
filesystem.root.getDirectory(name,{create:true,exclusive:true});
}
function listFiles(path){
var dir = filesystem.root;
if (path) dir = dir.getDirectory(path);
var lister = dir.createReader();
var list = [];
do{
var entries = lister.readEntries();
for(var i=0;i<entries.length;i++){
var name=entries[i].name;
if(entries[i].isDirectory)name+="/";
list.push(name);
}
}while(entries.length>0);
return list;
}
// 允许主线程通过发送消息来使用这些工具函数
onmessage = function(e){
// 消息是如下形式的对象
// 根据指定调用指定的函数
// 再将结果消息发送回去
var f =this.self[e.data.function];
var result = f.apply(null,e.data.args);
this.postMessage(result);
}