Actionscript 3 在as3 AdobeAIR中压缩文件夹

Actionscript 3 在as3 AdobeAIR中压缩文件夹,actionscript-3,flash,air,zip,zipfile,Actionscript 3,Flash,Air,Zip,Zipfile,我已经创建了一个Air应用程序,在用户交互后将创建一个包含bmp、xml和文本文档的文件夹。 除了制作需要自动的最终拉链之外,所有这些都可以工作 我一直在寻找解决办法,但找不到。 也许我只是没有看到,如果是的话,请有人给我看看 我的原始帖子在这里-- 我找到的最接近的东西是这个-- 但由于某种原因,我的邮件被删除了,它是-- 我喜欢这个。这是我最接近于解决我自己问题的有效方法。这就是说,我测试了这个,它工作得很好。这个脚本是否可以在没有交互的情况下运行???我需要它来编写一个程序。任何立场都

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

我一直在寻找解决办法,但找不到。 也许我只是没有看到,如果是的话,请有人给我看看

我的原始帖子在这里--


我找到的最接近的东西是这个-- 但由于某种原因,我的邮件被删除了,它是--

我喜欢这个。这是我最接近于解决我自己问题的有效方法。这就是说,我测试了这个,它工作得很好。这个脚本是否可以在没有交互的情况下运行???我需要它来编写一个程序。任何立场都是好的。。。。。。。。除了向我指出Adobe Reference,因为它没有我需要的东西。(我能看到或找到的)

所以现在我在问社区

出于某种原因,它将与手动选择和手动保存一起工作,但不能同时工作。 即使需要另一整页脚本,也必须有一个解决方案

==================================================================== 更新: 为了解决这个问题,我终于找到了解决办法。 你可以在这里找到它。"".
希望我的问题能对将来的人有所帮助。

尝试使用as3 commons zip库

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

此代码段包含一个批量加载程序,用于为您处理该问题

警告

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

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();
}
一旦每个项目被加载,您就可以将其存储起来,以便添加到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();
}

您可以使用nochump zip库轻松创建zip文件,还可以使用FileStream和文件对象直接写入文件系统,而无需通过AIR进行用户交互。首先,我要承认,让我的头脑绕过压缩的进进出出对我来说是一场噩梦。我通常能更快地看到事情,也能更容易地找到代码,但现在我已经做到了。编辑---NoChump和FZIP是我能找到的唯一的东西,但我没有足够的信息和示例。其他人可能会觉得这很容易,但事情的紧张一面仍然让它很难。至于让操作系统来做这件事,我已经有了这样的设置作为后援,但我真的不想这么做。我想要一个程序运行,以streemline一切以及它将膨胀的软件。但是谢谢你的信息,谢谢你。我快速阅读了你的代码,看起来很有希望。所以我一有时间就去试试。:-)我知道现在已经有一段时间了,但只是有时间看看这个。由于我使用的是Flash Pro而不是Flex,而且对.swc文件还是新手,我发现很难进行设置和测试。.swc在库中很好,但我不知道在我的sript中使用什么“导入”。我还将“private function”转换为常规函数,因为它们在每件事情的结尾只会出现在一页上。你的代码与SWC呼叫匹配吗?f-a。。。。我一直在检查代码,慢慢地找出编译错误。有两项仍然有效。你能告诉我他们在推荐什么或需要什么吗。在修复所有错误之前,无法正确测试代码。有问题的是“资产”和“键”。@Tempus assets是您需要声明的词典的名称。var资产:Dictionary=newdictionary()。key是一个独特的字符串,用于将数据存储在Zipz中。根据系统的不同,我似乎注意到加载900-1200个文件时会冻结或挂起文件。不确定文件或加载程序类是否收到垃圾邮件,是否会导致一些问题。试图减慢循环的速度,使其能够加载、回调,而不是将其击死。
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();
}