1

我创建了一个 Air 应用程序,在用户交互后将创建一个包含 bmp、xml 和文本文档的文件夹。除了制作需要自动完成的最终拉链之外,其他所有工作都有效。

我一直在寻找解决方案,但找不到。也许我只是没有看到它,如果是这样,有人可以告诉我。

我的原始帖子在这里 --- 使用 Air as3 flash 压缩许多文件


我发现的最接近的是这个 ---使用 fzip 压缩一个文件夹 但由于某种原因,我的评论被删除了——

我喜欢这个。这是我最接近自己问题的可行解决方案。也就是说,我对此进行了测试,并且效果很好。这个脚本可以在没有交互的情况下运行吗???我需要它来编写我编写的程序。欢迎任何帮助........ 除了只是将我指向 Adob​​e 参考,因为它没有任何我需要的东西。(好吧,我可以看到或找到)

所以现在我重新询问社区。

出于某种原因,它将与手动选择和手动保存一起工作,但不是自动操作。即使它需要另一个完整的脚本页面,也必须有一个解决方法。

==================================================== ================== 更新:为了关闭这个,我终于得到了我的解决方案。你可以在这里找到它。“ zip 文件内容没有数据”。希望我的问题可以帮助将来的人。

4

1 回答 1

2

尝试使用 as3 commons zip 库。

http://www.as3commons.org/as3-commons-zip/index.html

为了做到这一点,您需要加载您的目录,遍历其所有内容并加载每个资产。

此代码片段包含一个批量加载程序来为您处理。

警告

我将大部分代码从我正在做类似事情的项目中提取出来,但我没有按原样测试它。可能有一些语法错误!

private var zip:Zip;

zip = new Zip();


zip.addEventListener(IOErrorEvent.IO_ERROR, this.createNewZip); //creates a new zip
zip.addEventListener(Event.COMPLETE, handleZipLoaded); //loads the current zip, this is not shown here
zip.load(new URLRequest(File.applicationStorageDirectory.resolvePath("myZip.zip").url)); //path to your zip file

创建新 zip 文件的方法

private function createNewZip(e:IOErrorEvent):void{

    trace("no zip");

    var stream:FileStream = new FileStream();
    stream.open(File.applicationStorageDirectory.resolvePath("myZip.zip"), FileMode.WRITE);

    zip.serialize(stream);
    stream.close();

}   

您可以使用它来将目录中的所有项目添加到您的 zip 文件中。

private function addDirToZip():void{

    var f:File = File.resolvePath("Your Dir");
    //this will be called when your directory listing has loaded
    f.addEventListener(FileListEvent.DIRECTORY_LISTING, handleDirLoaded);
    //you can also get the dir listing inline and not use a listener
    //doing it async will prevent ui lock
    f.getDirectoryListingAsync();

}

接下来你需要加载所有文件

protected function handleDirLoaded(e:FileListEvent):void{
    loadExternal = new Vector.<File>; //vector used to keep a handle on all files
    e.target.removeEventListener(FileListEvent.DIRECTORY_LISTING, handleDirLoaded);
    for(var i:int = 0 ; i < files.length ; i++){
        var f:File = files[i] as File;
        if(f.extension == "File Types you want"){  //you can do some file type checking here
              loadExternal.push(f);
        }

    }
   //start loading in the files
   loadFile();
}

这将通过 loadExternal 向量并加载所有文件

private function loadFile():void{
    currentFile = loadExternal.shift(); //returns the first item off the array

    //load the file
   var l:Loader = new Loader();
   l.contentLoaderInfo.addEventListener(Event.COMPLETE, handleLoaded);
   l.load(new URLRequest(currentFile.url));

}

加载每个项目后,您可以将其存储以添加到 zip

private function handleLoaded(e:Event):void{

    var l:Loader = e.target.loader as Loader;
    l.contentLoaderInfo.removeEventListener(Event.COMPLETE, handleLoaded);

    //storing everything in a dictionary 
    assets[currentFile.name] = l.content;

   //if we still have items to load go and do it all again

   if(loadExternal.length != 0){
        loadFile();
   } else {
       //now all files are loaded so lets add them to the zip
       addAssetsToZip();
   }

}

这是所有加载的文件实际放入 zip 并保存的位置

private funcion addAssetsToZip():void{

   for(var fileName:String in assets){
        var ba:ByteArray = new ByteArray(); //going to write this to the zip
        //make an object that holds the data and filename
        var data:Object = {};
        data.name = fileName;
        data.content = assets[fileName];
        ba.writeObject(data);
        //write this file to the zip
        zip.addFile(key, ba, false);
    }

    //and finally save everything out
    zip.close();
    var stream:FileStream = new FileStream();
    stream.open(File.applicationStorageDirectory.resolvePath("myZip.zip"), FileMode.WRITE);
    zip.serialize(stream);
    stream.close();
}
于 2012-09-09T19:18:42.273 回答