下面是我用来访问我正在处理的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”事件。
答案 0 :(得分:0)
解决!需要使用“ms:appx /// Assets / filename.txt”而不是“//Assets/filename.txt”。