在Flex / AIR中:是否可以检测可移动卷的大小?

时间:2012-04-03 17:05:17

标签: actionscript-3 flex air

我正在使用USB移动存储 - SD卡在AS3上编写一个应用程序,我需要在进度条中显示它上面的可用空间。

使用以下方法获取驱动器上的可用空间非常简单:

flash.filesystem.storageVolume.rootDirectory().spaceAvailable

..但是为了以图形方式显示可用空间,我需要知道驱动器的总大小,但无论如何我都找不到这些信息。

目前,我已经根据自由空间粗略地猜测了这个尺寸,但这显然远非理想。

我已经搜索了Adobe提供的大量文档并用Google搜索,直到我的手指疼痛,但没有运气。

我猜这可能无法使用标准框架,并且可能需要编写自定义的本地扩展 - 请告诉我我错了:)

1 个答案:

答案 0 :(得分:4)

我认为唯一可行的方法是递归扫描目录,这可能会占用复杂文件系统的大量时间。

import flash.filesystem.File;
import flash.system.Capabilities;

private function getDrives():void
{
     var os:String = Capabilities.os.substr(0, 3).toLowerCase();
     var currentDrives:Array = (os=="mac") ? new File('/Volumes/').getDirectoryListing() : File.getRootDirectories() ;
     for each(var file:File in currentDrives){
         trace ("Drive: " + file.name + " Size: " + file.size);
     }
}

或者,另一种方法:

import flash.filesystem.StorageVolume;

var volumes:Vector.<StorageVolume> = StorageVolumeInfo.storageVolumeInfo.getStorageVolumes();
for each (var volume:StorageVolume in volumes)
{
    // use isRemovable property for USB:
    if (volume.isRemovable && volume.isWritable)
        trace("Drive: " + volume.drive + " Size: " + volume.rootDirectory.size);
}

然后,使用如下函数递归扫描:

public function getDirectorySize(path:Array):Number
{
    var size:Number = new Number();
    for (var i:int = 0; i < path.length; i++)
    {
        if (File(path[i]).isDirectory)
            size += getDirectorySize(File(path[i]).getDirectoryListing());
        else
            size += File(path[i]).size;
    }
    return size;
}