在as3 Adob​​e AIR中压缩文件夹

时间:2012-09-08 13:05:51

标签: actionscript-3 flash air zip zipfile

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

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

我原来的帖子就在这里--- zip many files with Air as3 flash


我发现的最接近的是这一个--- zip a folder using fzip 但出于某种原因,我的删除被删除了 -

  

我喜欢这个。这是我最接近解决自己问题的工作方案。也就是说,我对此进行了测试,它的工作原理很好。这个脚本可以模式化运行没有交互???我需要它来编写我编写的程序。任何帮助都是欢迎........除了指向我的Adobe referance,因为它没有任何像我需要的东西。 (以及我能看到或找到的)

现在我正在重新询问社区。

出于某种原因,它可以用于手动选择和手动保存,但不能用于自动。 即使它需要另一整页的脚本,也必须有一个解决方法。

=============================================== ===================== 更新: 关闭这个,我终于得到了我的解决方案。 你可以在这里找到它。 “zip file contents have no data”。 希望我的问题可以在将来帮助某人。

1 个答案:

答案 0 :(得分: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();
}