Flash CS5处理“文件不存在”FileMode.READ情况中的错误

时间:2011-08-12 21:12:19

标签: ios actionscript-3 flash-cs5

我正在使用Flash CS5 Professional中的Flash游戏,最终将在iPhone上运行(因此是iOS标签)。我目前正在设计代码的保存游戏部分,我正在尝试设置当有人第一次运行游戏并且保存游戏文件尚不存在时会发生什么。这是我的代码:

public class SaveGameFile extends MovieClip {
    private var file:File;
    private var savedGame:XML;

    public function SaveGameFile() {
        addEventListener(Event.ADDED_TO_STAGE, addedFileSystem);
    }

    private function addedFileSystem(event:Event):void {
        removeEventListener(Event.ADDED_TO_STAGE, addedFileSystem);
        file = File.applicationStorageDirectory;
        file = file.resolvePath("saveGame1.xml");
        xmlLoad();
    }

    private function xmlLoad():void {
        var fileStream:FileStream = new FileStream();
        fileStream.addEventListener(IOErrorEvent.IO_ERROR, ioReadErrorHandler);
        fileStream.open(file, FileMode.READ);
        fileStream.addEventListener(Event.COMPLETE, xmlLoadCompleteHandler);
    }

    private function xmlLoadCompleteHandler(event:Event):void {
        var fileStream:FileStream = event.target as FileStream;
        fileStream.removeEventListener(Event.COMPLETE, xmlLoadCompleteHandler);
        var str:String = fileStream.readMultiByte(file.size, File.systemCharset);
        savedGame = XML(str);
        fileStream.close();
    }

    private function ioReadErrorHandler(event:Event):void {
        var fileStream:FileStream = event.target as FileStream;
        fileStream.removeEventListener(IOErrorEvent.IO_ERROR, ioReadErrorHandler);
        createFile();
        xmlSave();
    }

在ioReadErrorHandler中,我还有两个基本上创建XML文件并将其放入savedGame变量的函数。然后xmlSave创建XML文件。至少这是应该发生的事情。现在,当它到达

fileStream.open(file, FileMode.READ);

我收到错误#3003:文件或目录不存在,这意味着我的ioReadErrorHandler在这里没有做到这一点。如果我创建文件并保存它,那么这段代码完美无缺,我可以跟踪(savedGame),它显示就好了。但是,如果我试图让它创建它(正如我在第一次运行游戏时提到的那样),这就是我最终的结果。我在这里遗漏了什么,或者IOErrorEvent.IO_ERROR不是我需要做的工作吗?

此外一旦完成(并且当然正常工作),它会返回到FileMode.READ并再试一次吗?或者错误实际上是否会使您失去功能并且需要再次运行?

1 个答案:

答案 0 :(得分:2)

正如我自己发表的评论中所提到的,我找到了处理这种同步操作的正确方法。如果搜索到此内容的任何人想知道,这是更正的代码:

public class SaveGameFile extends MovieClip {
private var file:File;
private var savedGame:XML;

public function SaveGameFile() {
    addEventListener(Event.ADDED_TO_STAGE, addedFileSystem);
}

private function addedFileSystem(event:Event):void {
    removeEventListener(Event.ADDED_TO_STAGE, addedFileSystem);
    file = File.applicationStorageDirectory;
    file = file.resolvePath("saveGame1.xml");
    xmlLoad();
}

private function xmlLoad():void {
    var fileStream:FileStream = new FileStream();
    try {
        fileStream.open(file, FileMode.READ); 
    } catch(e:IOError) {
        createFile();
        xmlSave();
    }
    var str:String = fileStream.readMultiByte(file.size, File.systemCharset);
    savedGame = XML(str);
    fileStream.close();
}

再次“createFile():”运行一个创建XML文件并将其保存到变量“savedGame”的函数。然后“xmlSave();”运行一个实际保存文件的函数,以便xmlLoad在第一次在新设备上运行时加载一些东西。