以下は、私が取り組んでいるメトロ アプリのアセット ファイルにアクセスするために使用したコードです。
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 メソッドの戻り値の型が問題を引き起こしています。タスクに変更したところ、この部分は正常に動作しますが、「オブジェクト参照がインスタンスに設定されていません」というエラーが表示されます。await 演算子を使用するために Game_Loaded イベント ハンドラも非同期に変換しようとしましたが、「戻り値の型が間違っています」というコンパイラ エラーが発生します。
だから、非同期を完全に削除しようとしましたが、それはできないと思います。async 関数を使用せずにファイルを開く方法はありません。したがって、基本的には、await を使用して readFileFromDisk 関数を呼び出し、タスクが完了したら残りのコード実行を続行する方法が必要です。関数の待機中の呼び出しの「IsCompleted」イベントのようなもの。