В Flex / AIR: возможно ли определить размер съемного тома? - PullRequest
4 голосов
/ 03 апреля 2012

Я пишу приложение в AS3 для Flex, которое использует съемное запоминающее устройство USB - SD-карты - и мне нужно отобразить свободное место на нем в индикаторе выполнения.

Получение свободного места на диске достаточно просто, используя:

flash.filesystem.storageVolume.rootDirectory().spaceAvailable

.. но для графического отображения свободного места мне нужно знать общий размер диска, и я никак не могу получить эту информацию.

Пока я прибегал к угадыванию размера, исходя из свободного пространства, но это явно далеко от идеала.

Я просмотрел обширную документацию, которую предоставляет Adobe, и погуглил, пока у меня не болят пальцы, но не повезло.

Я полагаю, что это может быть невозможно со стандартной структурой и может потребовать написания собственного расширения Native - скажите, пожалуйста, что я не прав:)

1 Ответ

4 голосов
/ 03 апреля 2012

Я думаю, что единственный способ сделать это - это рекурсивно сканировать каталоги, что может занять много времени для сложных файловых систем.

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