次の方法で共有


方法: .NET Framework ストリームと Windows ランタイム ストリームの間で変換を行う (Windows のみ)

UWP アプリ用 .NET Framework は、完全な .NET Framework のサブセットです。 UWP アプリのセキュリティおよびその他の要件のために、ファイルを開いたり読み取ったりするために使用する .NET Framework API の完全なセットを使用できません。 詳細については、「.NET for UWP apps overview」(UWP アプリ用 .NET の概要) を参照してください。 ただし、他のストリームの処理操作のために .NET Framework API を使用することもできます。 これらのストリームを操作するには、MemoryStreamFileStream などの .NET Framework ストリーム型と、IInputStreamIOutputStreamIRandomAccessStream などの Windows ランタイム ストリームの間で変換できます。

System.IO.WindowsRuntimeStreamExtensions クラスには、これらの変換を容易にするメソッドが含まれています。 ただし、次のセクションで説明するように、.NET Framework と Windows ランタイムのストリームの間にある根本的な違いにより、これらのメソッドの使用結果に影響があります。

Windows ランタイムから .NET Framework ストリームに変換する

Windows ランタイム ストリームから .NET Framework ストリームに変換するには、次の System.IO.WindowsRuntimeStreamExtensions メソッドのいずれかを使用します。

Windows ランタイムでは、読み取り専用、書き込み専用、または読み取りと書き込みをサポートするストリームの種類が提供されています。 Windows ランタイム ストリームを .NET Framework ストリームに変換するとき、これらの機能は維持されます。 さらに、Windows ランタイム ストリームを .NET Framework ストリームに変換してから元に戻すと、元の Windows ランタイム インスタンスに戻ります。

変換する Windows ランタイム ストリームの機能と一致する変換メソッドを使用することをお勧めします。 ただし、IRandomAccessStream は読み取りも書き込みも可能なので (IOutputStreamIInputStream の両方を実装しているので)、変換メソッドでは元のストリームの機能が維持されます。 たとえば、WindowsRuntimeStreamExtensions.AsStreamForRead を使用して IRandomAccessStream を変換しても、変換された .NET Framework ストリームが読み取り可能に制限されるわけではありません。 書き込みも可能です。

例:Windows ランタイム ランダム アクセスを、.NET Framework ストリームに変換する

Windows ランタイム ランダム アクセス ストリームから .NET Framework ストリームに変換するには、WindowsRuntimeStreamExtensions.AsStream メソッドを使用します。

次のコード例では、ファイルを選択するように求められ、そのファイルが Windows ランタイム API で開かれた後、.NET Framework ストリームに変換されます。 ストリームを読み取って、テキスト ブロックに出力します。 通常、結果を出力する前に .NET Framework API でストリームを処理します。

// Create a file picker.
FileOpenPicker picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
picker.ViewMode = PickerViewMode.List;
picker.FileTypeFilter.Add(".txt");

// Show picker, enabling user to pick one file.
StorageFile result = await picker.PickSingleFileAsync();
if (result != null)
{
    try
    {
        // Retrieve the stream. This method returns a IRandomAccessStreamWithContentType.
        var stream = await result.OpenReadAsync();

        // Convert the stream to a .NET stream using AsStream, pass to a
        // StreamReader and read the stream.
        using (StreamReader sr = new StreamReader(stream.AsStream()))
        {
            TextBlock1.Text = sr.ReadToEnd();
        }
    }
    catch (Exception ex)
    {
        // ...
    }
}       

.NET Framework から Windows ランタイム ストリームに変換する

.NET Framework ストリームから Windows ランタイム ストリームに変換するには、次の System.IO.WindowsRuntimeStreamExtensions メソッドのいずれかを使用します。

.NET Framework ストリームを Windows ランタイム ストリームに変換する場合、変換されたストリームの機能は元のストリームによって異なります。 たとえば、元のストリームが読み取りと書き込みの両方をサポートしており、WindowsRuntimeStreamExtensions.AsInputStream を呼び出してそのストリームを変換した場合、返される型は IRandomAccessStream になります。 IRandomAccessStream では IInputStreamIOutputStream が実装されており、読み取りと書き込みがサポートされます。

.NET Framework ストリームでは、変換後も複製はサポートされません。 .NET Framework ストリームを Windows ランタイム ストリームに変換し、CloneStream を呼び出す GetInputStreamAt または GetOutputStreamAt を呼び出した場合、または CloneStream を直接呼び出した場合は、例外が発生します。

例:.NET Framework を Windows ランタイム ランダム アクセス ストリームに変換する

次の例で示すように、.NET Framework ストリームから Windows ランタイム ランダム アクセス ストリームに変換するには、AsRandomAccessStream メソッドを使用します。

重要

使用している .NET Framework ストリームがシークをサポートすること、またはそれを実行するストリームにコピーすることを確認します。 この確認には、 Stream.CanSeek プロパティを使用できます。

// Create an HttpClient and access an image as a stream.
var client = new HttpClient();
Stream stream = await client.GetStreamAsync("https://learn.microsoft.com/en-us/dotnet/images/hub/featured-1.png");
// Create a .NET memory stream.
var memStream = new MemoryStream();
// Convert the stream to the memory stream, because a memory stream supports seeking.
await stream.CopyToAsync(memStream);
// Set the start position.
memStream.Position = 0;
// Create a new bitmap image.
var bitmap = new BitmapImage();
// Set the bitmap source to the stream, which is converted to a IRandomAccessStream.
bitmap.SetSource(memStream.AsRandomAccessStream());
// Set the image control source to the bitmap.
Image1.Source = bitmap;

関連項目