文件系统API

本文介绍了如何使用异步和同步文件系统API。首先,详细探讨了异步API在处理文件操作时如何避免阻塞,确保程序的流畅运行。接着,对比了同步API的特点,强调其在简单场景下的适用性。无论选择哪种方式,理解这两种API的工作原理对于优化应用程序性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用异步文件系统API

// 这里使用的大部分异步函数都接受一个可选的错误回调函数
// 这里的回调函数只是简单地将错误输出
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值