循环浏览文件列表并下载 - 仅保存最后一个文件

时间:2013-01-04 15:51:47

标签: android actionscript-3 flash air

我正在使用此帖link here中的代码将远程SWF文件下载到磁盘。

我有一个XML文件列出了3个SWF文件,我正在使用每个循环来完成它们。追踪名称,显示所有3个唯一文件名。

在每个循环中使用文件下载代码时,只保存列表中的最后一个文件。

我的确切代码:

function onPlaylistComplete(e:Event)
{
    var List:XML = new XML(e.target.data);
    trace("List : " + List);

    for each(var item in List.playlist_ads.ad.ad_file_path)
    {
        var urlString:String = site_url + "/" + item;
        var urlReq:URLRequest = new URLRequest(urlString);
        var urlStream:URLStream = new URLStream();

        urlStream.addEventListener(Event.COMPLETE, loaded);
        urlStream.load(urlReq);

        function loaded(event:Event):void
        {
            var fileData:ByteArray = new ByteArray();
            urlStream.readBytes(fileData, 0, urlStream.bytesAvailable);
            writeBinaryFile(item, fileData);
        }


    }
}

function writeBinaryFile(name : String, array : ByteArray) : void {
    try {
        var f : File = File.documentsDirectory.resolvePath(name);
        var fs : FileStream = new FileStream();
        fs.open(f, FileMode.WRITE);
        fs.writeBytes(array);
        fs.close();
        trace(f.nativePath + " written.");
    }
    catch (err : Error) {
        trace(err.name);
    }
}

我在想,不管怎么说没有清除bytearray,或者我需要为每个文件使用一个bytearray?

希望你能提供帮助。

UPDATE - 我尝试了以下代码,将完成事件处理程序排除在循环之外,仍然存在相同的问题,并且正在使用最后一个文件名。在过去的几个小时里一直在尝试各种各样的事情!

for(i = 0; i < adArray.length; i++)
    {
        var swfItem = adArray[i];
        var urlString:String = site_url + "/" + adArray[i];
        var urlReq:URLRequest = new URLRequest(urlString);
        var urlStream:URLStream = new URLStream();

        urlStream.addEventListener(Event.COMPLETE, urlStreamComplete);
        urlStream.load(urlReq);


    }
    function urlStreamComplete(event:Event):void
        {
            var fileData:ByteArray = new ByteArray();
            var stream = event.target;
            stream.readBytes(fileData, 0, stream.bytesAvailable);
            try {
                var f : File = File.documentsDirectory.resolvePath(swfItem);
                var fs : FileStream = new FileStream();
                fs.open(f, FileMode.WRITE);
                fs.writeBytes(fileData);
                fs.close();
                trace(f.nativePath + " written.");
            }
            catch (err : Error) {
                trace(err.message);
            }
        }

1 个答案:

答案 0 :(得分:0)

首先将加载的函数移动到循环外部,现在它被多次声明。至于你的问题;在你加载的函数中,你正在引用在循环中分配的urlStream。在循环结束时,它将流保存到最后一个项目,而最后一个项目将由加载的方法使用。使用传递给已加载函数的事件(event.target)来获取调度事件的urlStream。对于加载函数中的项目也是如此,您需要某种字典设置来获取它。