2010-10-08 60 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