访问Windows 8 Metro应用程序中的文件时超出范围异常

时间:2012-10-15 13:17:24

标签: windows microsoft-metro

下面是我用来访问我正在处理的metro应用程序的资产文件的代码。

        async void readFileFromDisk (string fileName, string fileType)
    {
        string fileContent;

        StorageFile file = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFileAsync(fileName);
        using (IRandomAccessStream readStream = await file.OpenAsync(FileAccessMode.Read))
        {
            using (DataReader dataReader = new DataReader(readStream))
            {
                UInt32 numBytesLoaded = await dataReader.LoadAsync((UInt32)readStream.Size);
                fileContent = dataReader.ReadString(numBytesLoaded);
            }
        }

此代码在页面的Loaded事件的处理程序中运行。 我目前正在获得一个例外,说“值不在范围内”。错误发生在第一行本身,我尝试从安装文件夹中获取存储文件句柄。

在调试时,fileName字符串为Null。我想,我应该将代码移动到某个事件,这个事件在页面生命周期的后期阶段被触发,但似乎无法弄清楚什么是最好的地方。建议??

P.S。我需要在用户进行任何交互之前阅读此文件,因为它会读取用户将与之交互的级别数据。

编辑:

错过了几件事。 从加载事件的处理程序调用以下函数。

void Game_Loaded(object sender, RoutedEventArgs e)
    {
        //read all level files to the strings
        readFileFromDisk("//Assets/Levels/Start" + selectedLevel + ".txt", "Start");

此处理程序基本上以类似的方式调用上述函数用于不同的文件路径。字符串选择级别是静态变量,而fileName字符串是从同一个创建的。

编辑2:

发现问题,但解决方案仍然很遥远。 readFileFromDist方法的返回类型导致了问题。将其更改为任务,这部分工作正常,但我得到“对象引用未设置为实例”错误。尝试将Game_Loaded事件处理程序转换为异步,以使用await运算符,但这给了我“错误返回类型”的编译器错误。

所以,我试图完全删除异步,但我想我不能那样做。没有使用异步功能就无法打开文件。所以,我基本上需要一种方法来调用readFileFromDisk函数,使用await,并在任务完成后继续执行其余代码。等待函数调用的“IsCompleted”事件。

1 个答案:

答案 0 :(得分:0)

解决!需要使用“ms:appx /// Assets / filename.txt”而不是“//Assets/filename.txt”。