Ios 闪存CS5处理“;“文件不存在”;FileMode.READ情况下出错
我正在用flash CS5 Professional开发一款flash游戏,它最终将在iPhone上运行(因此是iOS标签)。我目前正在设计代码的保存游戏部分,我正在尝试设置当某人第一次运行游戏而保存游戏文件还不存在时会发生什么。这是我的密码:Ios 闪存CS5处理“;“文件不存在”;FileMode.READ情况下出错,ios,actionscript-3,flash-cs5,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 Sa
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_错误不是我需要做的事情
此外,一旦完成此操作(当然工作正常),它是否会返回到FileMode.READ并重试?或者,这个错误实际上是使您中断了函数,需要重新运行吗?正如我在自己帖子的评论中提到的,我找到了正确的方法来处理这个同步操作。如果任何搜索此信息的人想知道,以下是更正的代码:
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可以加载一些内容。。。。终于发现了我的问题所在。事件似乎只对异步操作起作用,我的代码是一个同步操作。而不是事件,我做了这件事,它现在完美地工作!对任何可能感兴趣的人来说都是<代码>尝试{fileStream.open(file,FileMode.READ);}catch(e:IOError){createFile();xmlSave();}