如何:在 .NET Framework 資料流及 Windows 執行階段資料流之間轉換 (僅限 Windows)

.NET Framework for UWP 應用程式是完整 .NET Framework 的子集。 由於 UWP 應用程式的安全性和其他要求,您無法使用整套 .NET Framework API 開啟和讀取檔案。 如需詳細資訊,請參閱 .NET for UWP 應用程式概觀。 不過,您可能會想要使用 .NET Framework API 進行其他資料流管理作業。 若要管理這些資料流,您可以在 .NET Framework 資料流類型 (例如 MemoryStreamFileStream) 和 Windows 執行階段資料流 (例如 IInputStreamIOutputStreamIRandomAccessStream) 之間轉換。

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 來轉換資料流,則傳回的類型為 IRandomAccessStreamIRandomAccessStream 會實作 IInputStreamIOutputStream,並支援讀取和寫入。

.NET Framework 資料流不支援複製,即使是在轉換之後也一樣。 如果您將 .NET Framework 資料流轉換為 Windows 執行階段資料流,並呼叫 GetInputStreamAtGetOutputStreamAt (它會呼叫 CloneStream),或者您直接呼叫 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;

另請參閱