0

以下は、私が取り組んでいるメトロ アプリのアセット ファイルにアクセスするために使用したコードです。

        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」イベントのようなもの。

4

1 に答える 1

0

解決しました!「//Assets/filename.txt」の代わりに「ms:appx /// Assets/filename.txt」を使用する必要があります。

于 2012-10-15T18:18:28.477 に答える