科尔多瓦文件大小函数

问题描述

也许这是一个简单的问题,但我搜索了两天却找不到答案。

我正在用cordova 开发一个文件管理器,只是为了学习cordova-plugin-file

我已经使用这个函数获得了一个文件夹中的文件列表:

window.resolveLocalFileSystemURL(cordova.file.externalDataDirectory,function (dirEntry) {

    var directoryReader = dirEntry.createReader();
    directoryReader.readEntries(function(entries) {

        var row;

        for (i=0; i<entries.length; i++) {

            row = entries[i];
            console.log(row.name);

        }

    },function(error) {
        console.log(error);
    });

},function(error) {
    console.log(error);
});

现在我想在文件名旁边打印文件大小,所以我写了这个函数,它给了我文件大小:

function getFileSize(file) {

    window.resolveLocalFileSystemURL(file,function (fileEntry) {
        fileEntry.file(function(fileObj) {
            var bytes = fileObj.size;
            var i = Math.floor(Math.log(bytes) / Math.log(1024)),sizes = ['B','KB','MB','GB','TB','PB','EB','ZB','YB'];
            returnSize = (bytes / Math.pow(1024,i)).toFixed(2) * 1 + ' ' + sizes[i];
        });
    });

}

有没有办法在 for 循环中实现这样的事情?

var row;
var size;

for (i=0; i<entries.length; i++) {

    row = entries[i];
    size = getFileSize(cordova.file.externalDataDirectory + row.name);
    console.log(row.name);

}

我知道问题在于文件插件的异步性质,但我找不到解决方案/实现我在这里尝试编码的正确语法是什么。

解决方法

不,您不能这样做,由于调用的异步性质,您需要回调。然后就可以渲染了。

我相信您在条目数组中拥有所有文件名/路径。循环遍历该数组并将大小保存在另一个数组中,做这样的事情

var size_array = [];
var total = 0;

for(var i = 0; i < entries.length; i++){
     getFileSize(i);
}


function getFileSize(index) {

    window.resolveLocalFileSystemURL(entries[index],function (fileEntry) {
        fileEntry.file(function(fileObj) {
            var bytes = fileObj.size;
            var i = Math.floor(Math.log(bytes) / Math.log(1024)),sizes = ['B','KB','MB','GB','TB','PB','EB','ZB','YB'];
            size_array[index] = (bytes / Math.pow(1024,i)).toFixed(2) * 1 + ' ' + sizes[i];
            total ++;
            if(total === entries.length){
                filesReady();
            }
        });
    });

}


function filesReady(){
   for(var i = 0; i < entries.length; i++){
      entries[i] <-- your file
      size_array[i] <-- its size
   }
}