2

C# Win8 Metro スタイル アプリでファイルから任意のデータを取得するという、非常に単純であるべきことを実行するのに非常に多くの問題があります。

既存のファイルを参照する StorageFile オブジェクトが与えられた場合、任意の位置をシークし、任意の値 (さまざまなサイズの整数、文字列、バイト、バイト配列など) を読み取ることができる必要があります。私が試したことは何もありません。

たとえば、IRandomAccessStreamusingを取得し、それを使用してStorageFile.OpenAsyncを構築し、ファイルの最初のバイトを読み取るためにDataReader使用しました。DataReader.ReadByteただしReadByte、例外がスローされます (「操作が有効な範囲外のデータにアクセスしようとしました」)。

私が C# と .NET の両方に比較的慣れていないことは、おそらく役に立たないでしょう。

誰かがこれを行う方法を概説できますか?


コード例を求められました。これは私が上で説明したものであり、多くの異なる試みの 1 つです。これらは正しいタイプでさえないかもしれません。fユーザーが選択した既存のファイルを参照する有効なStorageFileファイルです (したがって、権限の問題はありません)。

public async void Read(StorageFile f)
{
  IRandomAccessStream s = await f.OpenAsynch(FileAccessMode.Read);
  DataReader r = new DataReader(s);
  Byte b = r.ReadByte();
}

呼び出しは、ReadByte例外をスローするものです。

4

1 に答える 1

4

ファイル全体を文字列として読み取るために使用しているものは次のとおりです。

        using (var fs = await file.OpenAsync(FileAccessMode.Read))
        {
            using (var inStream = fs.GetInputStreamAt(0))
            {
                using (var reader = new DataReader(inStream))
                {
                    await reader.LoadAsync((uint)fs.Size);
                    string data = reader.ReadString((uint)fs.Size);
                    reader.DetachStream();
                    return data;
                }
            }
        }

ある位置をシークする明白なオプションの 1 つは、別の値を GetInputStreamAt() に渡すことです。バイトを読み取るには、reader.ReadBytes() を呼び出すだけです。このシナリオで何かが機能しない場合は、WinRT のバグまたは不完全な実装が原因である可能性があります。ファイルの読み取りは、4 つの異なるプロキシ クラスを使用するよりもはるかに簡単になるはずなので、これは変わる可能性があると推測します。

于 2012-05-17T20:46:22.827 に答える