2010-10-08 65 views
1

我有一个递归调用,其中包括一个异步操作(文件副本)..
我想知道递归调用何时结束(以及所有异步操作)。查找涉及异步操作的递归完成时

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-200MB并需要时间来复制,这 空白出来的UI和Flash播放器。
复制文件后,我想做更多的事情(希望没有 阻止用户界面)。

任何帮助?

谢谢大家。

回答

1

计数的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的条件,但复制没有完成。

+0

+1 thx回答:)接受 – Amitd 2010-10-09 08:52:42

1

您可以设置要复制的文件的静态类级计数器,当您找到要复制的另一个文件时该计数器会递增,并且当事件函数发出复制已结束的信号时递减。

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

+1 thx回答:) – Amitd 2010-10-09 08:52:18