Procedimiento Convertir flujos de .NET Framework en flujos de Windows Runtime y viceversa (solo Windows)

.NET Framework para aplicaciones para UWP es un subconjunto de la plataforma .NET Framework completa. Debido a los requisitos de seguridad y de otro tipo de las aplicaciones para UWP, no se puede usar el conjunto completo de API de .NET Framework para abrir y leer archivos. Para obtener más información, consulte Información general de .NET para aplicaciones para UWP. Sin embargo, puede que desee usar las API de .NET Framework para otras operaciones de manipulación de secuencias. Para manipular estos flujos, puede realizar la conversión entre un tipo de flujo de .NET Framework, como MemoryStream o FileStream, y un flujo de Windows Runtime, como IInputStream, IOutputStream o IRandomAccessStream.

La clase System.IO.WindowsRuntimeStreamExtensions contiene métodos que facilitan estas conversiones. Sin embargo, las diferencias subyacentes entre los flujos de .NET Framework y de Windows Runtime afectan a los resultados del uso de estos métodos, tal como se describe en las secciones siguientes:

Convertir un flujo de Windows Runtime en un flujo de .NET Framework

Para convertir un flujo de Windows Runtime en un flujo de .NET Framework, utilice uno de métodos de System.IO.WindowsRuntimeStreamExtensions siguientes:

Windows Runtime ofrece tipos de flujo que admiten solo lectura, solo escritura o lectura y escritura. Estas funcionalidades se mantienen al convertir un flujo de Windows Runtime en un flujo de .NET Framework. Además, en caso de convertir una secuencia de Windows en tiempo de ejecución en secuencia de .NET Framework y de nuevo al revés, obtendrá de nuevo la instancia original de Windows en tiempo de ejecución.

Un procedimiento recomendado consiste en usar el método de conversión que coincide con las funcionalidades del flujo de Windows Runtime que se quiere convertir. Pero como IRandomAccessStream es de lectura y escritura (implementa tanto IOutputStream como IInputStream), los métodos de conversión mantienen las funcionalidades del flujo original. Por ejemplo, el uso de WindowsRuntimeStreamExtensions.AsStreamForRead para convertir un objeto IRandomAccessStream, no limita el flujo de .NET Framework convertido a que sea legible. También es de escritura.

Ejemplo: Convertir un flujo de acceso aleatorio de Windows Runtime en un flujo de .NET Framework

Para convertir un flujo de acceso aleatorio de Windows Runtime en un flujo de .NET Framework, use el método WindowsRuntimeStreamExtensions.AsStream.

En el ejemplo de código siguiente, se le pide que seleccione un archivo, lo abra con las API de Windows Runtime y, a continuación, lo convierta en un flujo de .NET Framework. Lee el flujo y lo genera en un bloque de texto. Normalmente se manipularía el flujo con las API de .NET Framework antes de generar los resultados.

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

Convertir un flujo de .NET Framework en un flujo de Windows Runtime

Para convertir un flujo de .NET Framework en un flujo de Windows Runtime, utilice uno de métodos de System.IO.WindowsRuntimeStreamExtensions siguientes:

Al convertir un flujo de .NET Framework en un flujo de Windows Runtime, las funcionalidades del flujo convertido dependen del flujo original. Por ejemplo, si el flujo original admite lectura y escritura y se llama a WindowsRuntimeStreamExtensions.AsInputStream para convertir el flujo, el tipo devuelto es IRandomAccessStream. IRandomAccessStream implementa IInputStream y IOutputStream, y admite la lectura y la escritura.

Los flujos de .NET Framework no admiten la clonación, incluso después de la conversión. Si se convierte un flujo de .NET Framework en un flujo de Windows Runtime y se llama a GetInputStreamAt o GetOutputStreamAt, que a su vez llaman a CloneStream, o si llama a CloneStream directamente, se producirá una excepción.

Ejemplo: Convertir un flujo de .NET Framework en un flujo de acceso aleatorio de Windows Runtime

Para convertir una secuencia de .NET Framework en una secuencia de acceso aleatorio de Windows Runtime, use el método AsRandomAccessStream, como se muestra en el ejemplo siguiente:

Importante

Asegúrese de que el flujo de .NET Framework que está usando admite las búsquedas, o cópielo en un flujo que las admita. Puede usar la propiedad Stream.CanSeek para averiguarlo.

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

Vea también