我的程序有一个导出/导入功能,它使用AS3Commons3-zip在程序内部制作一些内容(图片、小视频、小 pdf)的 zip 文件。用户选择一个主题来制作 zipfile,选择保存位置,程序将文件复制到 tempDir(使用 File.createTempDirectory 方法),然后使用以下代码循环遍历 tempDir:
public function fileSelected(event:Event):void{
zipFile = event.currentTarget as File;
addFileToZip(tempDir, zip);
}
public function addFileToZip(file:File, zip:Zip, path:String=""):void{
if(file.isDirectory){
var directory:Array = file.getDirectoryListing();
filesToCompress = filesToCompress + directory.length;
dispatchEvent(new
for each (var f:File in directory){
addFileToZip(f, zip, path + "/" + file.name);
}
fileAddedToZip();
}else{
file.addEventListener(Event.COMPLETE, function():void{
var pathSplit:Array = file.nativePath.split(".tmp\\",2);
var fileNamePath:String = pathSplit[1] as String;
zip.addFile(fileNamePath, file.data);
fileAddedToZip();
});
file.addEventListener(ProgressEvent.PROGRESS, function(e:ProgressEvent):void{
totalLoaded = totalLoaded+e.bytesLoaded;
trace(totalLoaded+" <---TOTAL LOADED");
});
file.load();
}
}
public function fileAddedToZip():void{
filesCompressed++;
if (filesToCompress == filesCompressed){
var stream:FileStream = new FileStream();
stream.open(zipFile, FileMode.WRITE);
zip.serialize(stream);
stream.close();
tempDir.deleteDirectoryAsync(true);
}
}
并且代码本身似乎工作正常:zip 文件导入和导出非常好。问题是程序在看似随机的时间崩溃。有时它会处理 30 个文件,有时会崩溃 3 个文件。有时它会设法连续 3 次从相同文件制作相同的 zip,然后在第四次尝试某个文件时崩溃,第五次尝试在不同文件上崩溃。
例如: 5 次尝试将 35 个相同图像的副本导出到 zip 中:
- 35/35,总加载跟踪:3110337
- 35/35,总加载跟踪:3110337
- 崩溃,TOTAL LOADED 跟踪:初始化 26 个文件后为 0
- 35/35,总加载跟踪:3110337
- 35/35,总加载跟踪:3110337
- 崩溃,TOTAL LOADED 跟踪:初始化 14 个文件后为 0
- 崩溃,初始化第一个文件时崩溃
- 35/35,总加载跟踪:3110337
- 35/35,总加载跟踪:3110337
- 冻结没有崩溃(卡在文件 17/35,取消按钮工作等),总加载跟踪:1282932
我看不出它有什么模式。File.load() 方法似乎是罪魁祸首,但不知道为什么。崩溃根本不会引发任何错误。唯一可以确定的是,图像总大小越多(仍低于 100MB),崩溃就越常见。有任何想法吗?