2012-04-03 2 views
4

Я пишу приложение в AS3 на Flex, которое использует USB-съемное хранилище - SD-карты - и мне нужно отобразить пространство, доступное на нем, в индикаторе выполнения.В Flex/AIR: Можно ли определить размер съемного тома?

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

flash.filesystem.storageVolume.rootDirectory().spaceAvailable

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

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

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

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

ответ

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

Спасибо. Я рассмотрел возможность сканирования файловой системы, чтобы получить «использованное» значение пространства. Не имеет значения, если это не совсем точно, приближение будет очень хорошо. Я попробую и дам вам знать, как это работает. Еще раз спасибо! – Carl

+0

Вы можете рекурсивно сканировать асинхронно с помощью getDirectoryListingAsync, в котором вы могли бы немедленно визуализировать пространство, доступное при обновлении пространства, используемого в качестве итогов. Извините, это сделало бы большой запрос функции в Adobe. –

+0

Я предполагаю, что сканирование всего диска займет довольно много времени, я полагаю, вам лучше будет проверить ОС и использовать встроенные средства командной строки, чтобы получить необходимую информацию. Для окон вы можете использовать это: dir C: \ | find/i "bytes free"> drivespacefree.txt, для * nix систем вы можете использовать df http://www.cyberciti.biz/faq/check-free-space/ вы можете использовать bash в * nix как собственный процесс для запуска инструментов командной строки и cmd.exe в C: \ windows \ system32 \ на системах Windows. – shaunhusain