我有一个递归调用,其中包括一个asyn操作(文件复制)..
我想知道递归调用何时完成(以及所有asyn操作)。
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的文件,需要时间来复制,这些 消除用户界面和Flash播放器 文件被复制后,我想做更多的事情(希望没有 阻止UI)。
任何帮助?
全部谢谢。
答案 0 :(得分: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;
}
答案 1 :(得分: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
的情况,但复制还没完。