0

我的程序有一个导出/导入功能,它使用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 中:

  1. 35/35,总加载跟踪:3110337
  2. 35/35,总加载跟踪:3110337
  3. 崩溃,TOTAL LOADED 跟踪:初始化 26 个文件后为 0
  4. 35/35,总加载跟踪:3110337
  5. 35/35,总加载跟踪:3110337
  6. 崩溃,TOTAL LOADED 跟踪:初始化 14 个文件后为 0
  7. 崩溃,初始化第一个文件时崩溃
  8. 35/35,总加载跟踪:3110337
  9. 35/35,总加载跟踪:3110337
  10. 冻结没有崩溃(卡在文件 17/35,取消按钮工作等),总加载跟踪:1282932

我看不出它有什么模式。File.load() 方法似乎是罪魁祸首,但不知道为什么。崩溃根本不会引发任何错误。唯一可以确定的是,图像总大小越多(仍低于 100MB),崩溃就越常见。有任何想法吗?

4

1 回答 1

0

通过使用 URLLoader 解决了这个问题:

var request:URLRequest = new URLRequest(file.nativePath);
            var urlLoader:URLLoader = new URLLoader(request);

            urlLoader.addEventListener(Event.COMPLETE, function (event:Event):void {

                var pathSplit:Array = file.nativePath.split(".tmp\\",2);
                var fileNamePath:String = pathSplit[1] as String;                   
                zip.addFile(fileNamePath, event.target.data);

                fileAddedToZip();

            });
            urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
            urlLoader.load(request);
于 2013-06-26T12:51:06.577 回答