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

Program .NET Framework dla aplikacji platformy UWP jest podzbiorem pełnego programu .NET Framework. Ze względu na zabezpieczenia i inne wymagania dotyczące aplikacji platformy UWP nie można używać pełnego zestawu interfejsów API programu .NET Framework do otwierania i odczytywania plików. Aby uzyskać więcej informacji, zobacz Omówienie platformy .NET dla aplikacji 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żesz przekonwertować między typem strumienia programu .NET Framework, takim jak MemoryStream lub , FileStreami strumieniem środowisko wykonawcze systemu Windows, takim jak IInputStream, IOutputStreamlub IRandomAccessStream.

Klasa System.IO.WindowsRuntimeStreamExtensions zawiera metody, które ułatwiają te konwersje. Jednak podstawowe różnice między programem .NET Framework i strumieniami środowisko wykonawcze systemu Windows wpływają na wyniki korzystania z tych metod, jak opisano w poniższych sekcjach:

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

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

Środowisko wykonawcze systemu Windows oferuje typy strumieni, które obsługują tylko odczyt, zapis lub odczyt i zapis. Te możliwości są zachowywane podczas konwertowania strumienia środowisko wykonawcze systemu Windows na strumień programu .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 zgodnej z możliwościami strumienia środowisko wykonawcze systemu Windows, który chcesz przekonwertować. Jednak ponieważ IRandomAccessStream jest czytelny i zapisywalny (implementuje zarówno metody konwersji, jak IOutputStream i IInputStream), metody konwersji utrzymują możliwości oryginalnego strumienia. Na przykład użycie metody WindowsRuntimeStreamExtensions.AsStreamForRead do konwersji IRandomAccessStream elementu nie ogranicza przekonwertowanego strumienia programu .NET Framework do odczytu. Jest również zapisywalny.

Przykład: konwertowanie środowisko wykonawcze systemu Windows losowego dostępu do strumienia programu .NET Framework

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

Poniższy przykład kodu wyświetla monit o wybranie pliku, otwiera go przy użyciu interfejsów API środowisko wykonawcze systemu Windows, a następnie konwertuje go na strumień programu .NET Framework. Odczytuje strumień i wyprowadza go do bloku tekstowego. Zwykle można manipulować strumieniem za pomocą interfejsów API programu .NET Framework przed wyprowadzeniem wyników.

// 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)
    {
        // ...
    }
}       

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

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

Podczas konwertowania strumienia programu .NET Framework na strumień środowisko wykonawcze systemu Windows możliwości przekonwertowanego strumienia zależą od oryginalnego strumienia. Jeśli na przykład oryginalny strumień obsługuje zarówno odczyt, jak i zapis, i wywołujesz WindowsRuntimeStreamExtensions.AsInputStream metodę konwersji strumienia, zwracany typ to IRandomAccessStream. IRandomAccessStream implementuje IInputStream i IOutputStreamobsługuje odczytywanie i pisanie.

Strumienie programu .NET Framework nie obsługują klonowania, nawet po konwersji. W przypadku konwersji strumienia programu .NET Framework na strumień środowisko wykonawcze systemu Windows i wywołanie metody lub GetOutputStreamAt, które CloneStreamwywołają metodę , lub w przypadku bezpośredniego wywołania GetInputStreamAtCloneStream wystąpi wyjątek.

Przykład: konwertowanie programu .NET Framework na strumień z dostępem losowym środowisko wykonawcze systemu Windows

Aby przekonwertować strumień programu .NET Framework na strumień środowisko wykonawcze systemu Windows strumienia z dostępem losowym, użyj AsRandomAccessStream metody , jak pokazano w poniższym przykładzie:

Ważne

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

// 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;

Zobacz też