Como converter entre fluxos do .NET Framework e do Tempo de Execução do Windows (somente Windows)

O .NET Framework para aplicativos UWP é um subconjunto do .NET Framework completo. Devido à segurança e outros requisitos para aplicativos UWP, você não pode usar o conjunto completo de APIs do .NET Framework para abrir e ler arquivos. Para obter mais informações, consulte Visão geral do .NET para aplicativos UWP. No entanto, você pode querer usar APIs do .NET Framework para outras operações de manipulação de fluxo. Para manipular esses fluxos, você pode converter entre um tipo de fluxo do .NET Framework, como MemoryStream ou FileStream, e um fluxo do Tempo de Execução do Windows, como IInputStream, IOutputStreamou IRandomAccessStream.

A System.IO.WindowsRuntimeStreamExtensions classe contém métodos que facilitam essas conversões. No entanto, as diferenças subjacentes entre o .NET Framework e os fluxos do Tempo de Execução do Windows afetam os resultados do uso desses métodos, conforme descrito nas seguintes seções:

Converter de um Tempo de Execução do Windows para um fluxo do .NET Framework

Para converter de um fluxo do Tempo de Execução do Windows para um fluxo do .NET Framework, use um dos seguintes System.IO.WindowsRuntimeStreamExtensions métodos:

O Tempo de Execução do Windows oferece tipos de fluxo que oferecem suporte somente leitura, somente gravação ou leitura e gravação. Esses recursos são mantidos quando você converte um fluxo do Tempo de Execução do Windows em um fluxo do .NET Framework. Além disso, se você converter um fluxo do Tempo de Execução do Windows em um fluxo do .NET Framework e vice-versa, obterá a instância original do Tempo de Execução do Windows de volta.

É uma prática recomendada usar o método de conversão que corresponda aos recursos do fluxo do Tempo de Execução do Windows que você deseja converter. No entanto, como IRandomAccessStream é legível e gravável (implementa ambos IOutputStream e IInputStream), os métodos de conversão mantêm os recursos do fluxo original. Por exemplo, usar WindowsRuntimeStreamExtensions.AsStreamForRead para converter um IRandomAccessStream não limita o fluxo convertido do .NET Framework a ser legível. Também é gravável.

Exemplo: converter o acesso aleatório do Tempo de Execução do Windows em fluxo do .NET Framework

Para converter de um fluxo de acesso aleatório do Tempo de Execução do Windows para um fluxo do .NET Framework, use o WindowsRuntimeStreamExtensions.AsStream método.

O exemplo de código a seguir solicita que você selecione um arquivo, abre-o com APIs do Tempo de Execução do Windows e o converte em um fluxo do .NET Framework. Ele lê o fluxo e o envia para um bloco de texto. Normalmente, você manipularia o fluxo com APIs do .NET Framework antes de enviar os 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)
    {
        // ...
    }
}       

Converter de um .NET Framework para um fluxo do Tempo de Execução do Windows

Para converter de um fluxo do .NET Framework para um fluxo do Tempo de Execução do Windows, use um dos seguintes System.IO.WindowsRuntimeStreamExtensions métodos:

Quando você converte um fluxo do .NET Framework em um fluxo do Tempo de Execução do Windows, os recursos do fluxo convertido dependem do fluxo original. Por exemplo, se o fluxo original suportar leitura e gravação e você chamar WindowsRuntimeStreamExtensions.AsInputStream para converter o fluxo, o tipo retornado será um IRandomAccessStreamarquivo . IRandomAccessStreamimplementa e IOutputStream, e apoia a IInputStream leitura e a escrita.

Os fluxos do .NET Framework não oferecem suporte à clonagem, mesmo após a conversão. Se você converter um fluxo do .NET Framework em um fluxo do Tempo de Execução do Windows e chamar GetInputStreamAt ou GetOutputStreamAt, que chamar CloneStream, ou se você chamar CloneStream diretamente, ocorrerá uma exceção.

Exemplo: Converter o .NET Framework em fluxo de acesso aleatório do Tempo de Execução do Windows

Para converter de um fluxo do .NET Framework para um fluxo de acesso aleatório do Tempo de Execução do Windows, use o AsRandomAccessStream método, conforme mostrado no exemplo a seguir:

Importante

Certifique-se de que o fluxo do .NET Framework que você está usando oferece suporte à busca ou copie-o para um fluxo que o faça. Você pode usar a Stream.CanSeek propriedade para determinar isso.

// Create an HttpClient and access an image as a stream.
var client = new HttpClient();
Stream stream = await client.GetStreamAsync("https://video2.skills-academy.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;

Consulte também