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

4

我正在使用Flex和AS3编写一个应用程序,利用USB可移动存储 - SD卡 - 并需要在进度条中显示其可用空间。

使用以下方法可以轻松获取驱动器上可用的空间:

flash.filesystem.storageVolume.rootDirectory(). spaceAvailable

但是,要以图形方式显示剩余空间,我需要知道驱动器的总大小,但是我找不到获取该信息的任何方法。

目前,我已经根据可用空间大致猜测了大小,但这显然远非理想。

我已经搜索了Adobe提供的大量文档并且反复搜索了谷歌,但没有运气。

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

1个回答

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;
}

谢谢。我确实考虑过扫描文件系统以获取“已使用”空间值。即使不是绝对准确,近似值也可以。我会尝试一下并告诉你它的效果如何。再次感谢! - Carl
您可以使用getDirectoryListingAsync进行递归异步扫描,同时在可用空间更新时立即可视化空间,而随着总量的变化,也会更新已用空间。很抱歉,这需要向Adobe提出一个很好的功能请求。 - Jason Sturges
我想扫描整个磁盘可能需要相当长的时间,我猜你最好检查操作系统并使用内置的命令行工具来获取所需的信息。对于Windows系统,您可以使用以下命令:dir C:|find /i "bytes free" > drivespacefree.txt,对于nix系统,您可以使用df http://www.cyberciti.biz/faq/check-free-space/,您可以在nix中使用bash作为本地进程运行命令行工具,在Windows系统中使用C:\windows\system32\下的cmd.exe。 - shaunhusain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接