Обработка Flash CS5 «файл не существует» Ошибка в ситуации FileMode.READ - PullRequest
2 голосов
/ 13 августа 2011

Я работаю над флэш-игрой во Flash CS5 Professional, которая в конечном итоге будет работать на 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 и помещают его в переменную saveGame. Затем xmlSave создает файл XML. По крайней мере, так и должно быть. Прямо сейчас, когда дело доходит до

fileStream.open(file, FileMode.READ);

Я получаю сообщение об ошибке # 3003: файл или каталог не существует, что означает, что мой ioReadErrorHandler здесь не работает. Если я создаю файл и сохраняю его, то этот код работает отлично, и я могу проследить (saveGame), и он обнаруживается просто отлично. Но если я попытаюсь заставить его создать его (что, как я уже говорил, должно быть при первом запуске игры), это то, где я в конечном итоге. Я что-то здесь упускаю или IOErrorEvent.IO_ERROR - это не то, что мне нужно для этой работы?

Также, как только это будет сделано (и, конечно, будет работать правильно), вернется ли он в FileMode.READ и попробует ли снова? Или ошибка фактически вырвала вас из функции, и ее нужно запустить снова?

1 Ответ

2 голосов
/ 16 августа 2011

Как уже упоминалось в комментарии к моему собственному сообщению, я нашел правильный способ справиться с этой синхронной операцией. Вот исправленный код, если кто-то ищет это хочет знать:

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-файл и сохраняет его в переменной «saveGame». Тогда "xmlSave ();" запускает функцию для фактического сохранения файла, чтобы xmlLoad что-то загружал при первом запуске на новом устройстве.

...