我创建了一个Air应用程序,在用户交互后将创建一个包含bmp,xml和text doc的文件夹。 所有工作除了制作需要自动的最终拉链之外。
我一直在寻找解决方案,但无法找到它。 也许我只是没有看到它,如果是这样,有人可以告诉我。
我原来的帖子就在这里--- zip many files with Air as3 flash
我发现的最接近的是这一个--- zip a folder using fzip 但出于某种原因,我的删除被删除了 -
我喜欢这个。这是我最接近解决自己问题的工作方案。也就是说,我对此进行了测试,它的工作原理很好。这个脚本可以模式化运行没有交互???我需要它来编写我编写的程序。任何帮助都是欢迎........除了指向我的Adobe referance,因为它没有任何像我需要的东西。 (以及我能看到或找到的)
现在我正在重新询问社区。 p>
出于某种原因,它可以用于手动选择和手动保存,但不能用于自动。 即使它需要另一整页的脚本,也必须有一个解决方法。
=============================================== ===================== 更新: 关闭这个,我终于得到了我的解决方案。 你可以在这里找到它。 “zip file contents have no data”。 希望我的问题可以在将来帮助某人。
答案 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();
}