Узнать, когда заканчивается рекурсия с асинхронной операцией - PullRequest
1 голос
/ 08 октября 2010

У меня есть рекурсивный вызов, который включает в себя асинхронную операцию (копирование файла) ..
Я хочу узнать, когда рекурсивный вызов завершится (вместе со всеми асинхронными операциями).

    private function copyInto(directoryToCopy:File, locationCopyingTo:File):void
        {
          var directory:Array = directoryToCopy.getDirectoryListing();
          //get list of files in dir 

          for each (var f:File in directory)
          {
            if (f.isDirectory)
              copyInto(f, locationCopyingTo.resolvePath(f.name));
            else
             {
               f.copyToAsyn(locationCopyingTo.resolvePath(f.name), true);
               f.addEventListener(Event.COMPLETE, onFilecopied);
              }
          }    
        }

function onFileCopied(event){ 
    alert(event.target); // [object File] 
} 

В основноммне нужно было скопировать структуру папок на другой диск, и копируемая папка содержит некоторые файлы размером 100-200 МБ, для копирования которых требуется время, что исключает интерфейс пользователя и флэш-плеер.
И после файловскопировать, я хочу сделать что-то еще (надеюсь, не блокируя пользовательский интерфейс).

Любая помощь?

Спасибо всем.

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Считайте вызовы copyToAsync и используйте функцию-оболочку, например doCopy в моем примере.

private var copyCount: int = 0;
private var isCopying: Boolean = false;

public function doCopy(directoryToCopy:File, locationCopyingTo:File):void
{
    isCopying = true;
    try {
      copyInto((directoryToCopy, locationCopyingTo);
    finally {
      isCopying = false;
    } 
}

private function copyInto(directoryToCopy:File, locationCopyingTo:File):void {
    var directory:Array = directoryToCopy.getDirectoryListing();

    for each (var f:File in directory) {
        if (f.isDirectory)
            copyInto(f, locationCopyingTo.resolvePath(f.name));
        else {
            copyCount++; 
            f.addEventListener(Event.COMPLETE, onFileCopied);
            f.copyToAsync(locationCopyingTo.resolvePath(f.name), true);
        }
    }    
}

function onFileCopied(event: Event): void
{ 
    copyCount--;
    if (copyCount == 0 && !isCopying)
        trace("finished");
} 

Важно: Флаг isCopying проверяет, работает ли функция copyInto, в противном случае вы можете столкнуться с условием, когда copyCount == 0, но копирование выполняетсяне закончен.

1 голос
/ 08 октября 2010

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

private static fileCounter:int = 0;

и в цикле:

++fileCounter;
f.addEventListener(Event.COMPLETE, onFilecopied);
f.copyToAsync(locationCopyingTo.resolvePath(f.name), true);

и в обработчике событий:

function onFileCopied(event)
{ 
    if ( --fileCounter == 0 )
        trace("finished");
} 

Но слаб, потому что вы не можете восстановить после ошибок, а также не знаете, какие файлы были скопированы. Чтобы создать более надежное решение, вы можете хранить в классе не только счетчик файлов, но и список имен файлов:

class FileCopyInfo
{
...
    private var fileName:String;
    private var finished:Boolean;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...