Instrukcje: konwertowanie między strumieniami .NET Framework i środowisko wykonawcze systemu Windows (tylko system Windows)

.NET Framework for platformy UWP Apps to podzbiór pełnych .NET Framework. Ze względu na bezpieczeństwo i inne wymagania dotyczące aplikacji platformy UWP nie można używać pełnego zestawu .NET Framework interfejsów API do otwierania i odczytywania plików. Aby uzyskać więcej informacji, zobacz temat Omówienie aplikacji .net for platformy UWP. Jednak może być wymagane użycie interfejsów API programu .NET Framework w celu wykonywania innych operacji na strumieniach. Aby manipulować tymi strumieniami, można dokonać konwersji między typem strumienia .NET Framework, takim jak MemoryStream lub FileStream i strumieniem środowisko wykonawcze systemu Windows, takim jak IInputStream , IOutputStream lub IRandomAccessStream .

System.IO.WindowsRuntimeStreamExtensionsKlasa zawiera metody, które ułatwiają wykonywanie tych konwersji. Jednak podstawowe różnice między strumieniami .NET Framework i środowisko wykonawcze systemu Windows wpływają na wyniki korzystania z tych metod, zgodnie z opisem w poniższych sekcjach:

Konwertowanie środowisko wykonawcze systemu Windows na strumień .NET Framework

Aby przekonwertować strumień środowisko wykonawcze systemu Windows do strumienia .NET Framework, użyj jednej z następujących System.IO.WindowsRuntimeStreamExtensions metod:

Środowisko wykonawcze systemu Windows oferuje typy strumieni obsługujące tylko odczyt, tylko do zapisu i odczytywanie i zapisywanie. Te funkcje są utrzymywane podczas konwertowania strumienia środowisko wykonawcze systemu Windows do strumienia .NET Framework. Co więcej, po przekonwertowaniu strumienia środowiska wykonawczego systemu Windows na strumień programu .NET Framework i z powrotem jest przywracane oryginalne wystąpienie strumienia środowiska wykonawczego systemu Windows.

Najlepszym rozwiązaniem jest użycie metody konwersji, która jest zgodna z możliwościami strumienia środowisko wykonawcze systemu Windows, które chcesz skonwertować. Jednak ponieważ IRandomAccessStream jest możliwy do odczytu i zapisu (implementuje zarówno IOutputStream i IInputStream ), metody konwersji zachowują możliwości oryginalnego strumienia. Na przykład użycie WindowsRuntimeStreamExtensions.AsStreamForRead do konwersji IRandomAccessStream nie ogranicza przekonwertowanego strumienia .NET Framework, aby można było go odczytać. Jest również zapisywalny.

Przykład: konwertowanie środowisko wykonawcze systemu Windows dostęp losowy do strumienia .NET Framework

Aby przekonwertować strumień środowisko wykonawcze systemu Windows dostęp losowy do strumienia .NET Framework, użyj WindowsRuntimeStreamExtensions.AsStream metody.

Poniższy przykład kodu wyświetla komunikat, aby wybrać plik, otwiera go z środowisko wykonawcze systemu Windows interfejsów API, a następnie konwertuje go na strumień .NET Framework. Odczytuje strumień i wyprowadza go do bloku tekstu. Zazwyczaj można manipulować strumieniem za pomocą interfejsów API .NET Framework, zanim zostaną one wprowadzone.

Aby uruchomić ten przykład, należy utworzyć aplikację XAML platformy UWP, która zawiera blok tekstu o nazwie TextBlock1 i przycisk o nazwie Button1 . Skojarz zdarzenie kliknięcia przycisku z button1_Click metodą pokazaną w przykładzie.

using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage;
using System.Net.Http;
using Windows.Storage.Pickers;

private async void button1_Click(object sender, RoutedEventArgs e)
{
    // Create a file picker.
    FileOpenPicker picker = new FileOpenPicker();

    // Set properties on the file picker such as start location and the type
    // of files to display.
    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)
        {
            TextBlock1.Text = "Error occurred reading the file. " + ex.Message;
        }
    }
    else
    {
        TextBlock1.Text = "User did not pick a file";
    }
}
Imports System.IO
Imports System.Runtime.InteropServices.WindowsRuntime
Imports Windows.UI.Xaml
Imports Windows.UI.Xaml.Controls
Imports Windows.UI.Xaml.Media.Imaging
Imports Windows.Storage
Imports System.Net.Http
Imports Windows.Storage.Pickers

Private Async Sub button1_Click(sender As Object, e As RoutedEventArgs)
    ' Create a file picker.
    Dim picker As New FileOpenPicker()

    ' Set properties on the file picker such as start location and the type of files to display.
    picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary
    picker.ViewMode = PickerViewMode.List
    picker.FileTypeFilter.Add(".txt")

    ' Show picker that enable user to pick one file.
    Dim result As StorageFile = Await picker.PickSingleFileAsync()

    If result IsNot Nothing Then
        Try
            ' Retrieve the stream. This method returns a IRandomAccessStreamWithContentType.
            Dim stream = Await result.OpenReadAsync()

            ' Convert the stream to a .NET stream using AsStreamForRead, pass to a 
            ' StreamReader and read the stream.
            Using sr As New StreamReader(stream.AsStream())
                TextBlock1.Text = sr.ReadToEnd()
            End Using
        Catch ex As Exception
            TextBlock1.Text = "Error occurred reading the file. " + ex.Message
        End Try
    Else
        TextBlock1.Text = "User did not pick a file"
    End If
End Sub

Konwertowanie .NET Framework na strumień środowisko wykonawcze systemu Windows

Aby przekonwertować strumień .NET Framework do strumienia środowisko wykonawcze systemu Windows, użyj jednej z następujących System.IO.WindowsRuntimeStreamExtensions metod:

Podczas konwertowania strumienia .NET Framework do strumienia środowisko wykonawcze systemu Windows możliwości przekonwertowanego strumienia zależą od oryginalnego strumienia. Na przykład, jeśli oryginalny strumień obsługuje odczytywanie i zapisywanie, a wywołanie WindowsRuntimeStreamExtensions.AsInputStream do konwersji strumienia, zwracanym typem jest IRandomAccessStream . IRandomAccessStream implementuje IInputStream i IOutputStream obsługuje odczytywanie i zapisywanie.

Strumienie .NET Framework nie obsługują klonowania, nawet po konwersji. W przypadku przekonwertowania strumienia .NET Framework na strumień środowisko wykonawcze systemu Windows i wywołanie GetInputStreamAt lub GetOutputStreamAt , które wywołuje CloneStream lub jeśli wywołasz CloneStream bezpośrednio, wystąpi wyjątek.

Przykład: konwertowanie .NET Framework na środowisko wykonawcze systemu Windows strumień dostępu swobodnego

Aby przekonwertować strumień .NET Framework do strumienia środowisko wykonawcze systemu Windows dostępu swobodnego, użyj AsRandomAccessStream metody, jak pokazano w następującym przykładzie:

Ważne

Upewnij się, że używany strumień .NET Framework obsługuje wyszukiwanie, lub skopiuj go do strumienia, który wykonuje. Stream.CanSeekAby to określić, można użyć właściwości.

Aby uruchomić ten przykład, należy utworzyć aplikację XAML platformy UWP, która jest przeznaczona dla .NET Framework 4.5.1 i zawiera blok tekstu o nazwie TextBlock2 i przycisk o nazwie Button2 . Skojarz zdarzenie kliknięcia przycisku z button2_Click metodą pokazaną w przykładzie.

using System;
using System.IO;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
using Windows.Storage;
using System.Net.Http;
using Windows.Storage.Pickers;

private async void button2_Click(object sender, RoutedEventArgs e)
{
    // Create an HttpClient and access an image as a stream.
    var client = new HttpClient();
    Stream stream = await client.GetStreamAsync("https://docs.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;
}
Imports System.IO
Imports System.Runtime.InteropServices.WindowsRuntime
Imports Windows.UI.Xaml
Imports Windows.UI.Xaml.Controls
Imports Windows.UI.Xaml.Media.Imaging
Imports Windows.Storage
Imports System.Net.Http
Imports Windows.Storage.Pickers

Private Async Sub button2_Click(sender As Object, e As RoutedEventArgs)


    ' Create an HttpClient and access an image as a stream.
    Dim client = New HttpClient()
    Dim stream As Stream = Await client.GetStreamAsync("https://docs.microsoft.com/en-us/dotnet/images/hub/featured-1.png")
    ' Create a .NET memory stream.
    Dim 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.
    Dim 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
End Sub

Zobacz też