0

下面是我用来访问我正在开发的 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 事件的处理程序中运行。我目前收到一个例外,说“价值不在范围内”。错误发生在第一行本身,我尝试从安装文件夹中获取 storagefile 句柄。

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

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

编辑:

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

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”事件。

4

1 回答 1

0

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

于 2012-10-15T18:18:28.477 回答