Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
.NET Framework для приложений UWP — это подмножество полной платформы .NET Framework. Из-за безопасности и других требований для приложений UWP нельзя использовать полный набор API .NET Framework для открытия и чтения файлов. Дополнительные сведения см. в разделе .NET для приложений UWP. Однако для других операций обработки потоков может потребоваться использовать API .NET Framework. Для управления этими потоками можно преобразовать тип потока .NET Framework, такой как MemoryStream или FileStream, в поток среды выполнения Windows, например IInputStream, IOutputStream или IRandomAccessStream.
Класс System.IO.WindowsRuntimeStreamExtensions содержит методы, которые упрощают эти преобразования. Однако базовые различия между потоками среды выполнения .NET Framework и Windows влияют на результаты использования этих методов, как описано в следующих разделах:
Преобразование из среды выполнения Windows в поток .NET Framework
Чтобы преобразовать поток среды выполнения Windows в поток .NET Framework, используйте один из следующих System.IO.WindowsRuntimeStreamExtensions методов:
WindowsRuntimeStreamExtensions.AsStream преобразует поток случайного доступа в среду выполнения Windows в управляемый поток в .NET для приложений UWP.
WindowsRuntimeStreamExtensions.AsStreamForWrite преобразует выходной поток в среду выполнения Windows в управляемый поток в .NET для приложений UWP.
WindowsRuntimeStreamExtensions.AsStreamForRead преобразует входной поток в среду выполнения Windows в управляемый поток в .NET для приложений UWP.
Среда выполнения Windows предлагает типы потоков, которые поддерживают только чтение, запись только или чтение и запись. Эти возможности сохраняются при преобразовании потока среды выполнения Windows в поток .NET Framework. Кроме того, при преобразовании потока среды выполнения Windows в поток .NET Framework и обратно вы получите исходный экземпляр среды выполнения Windows.
Рекомендуется использовать метод преобразования, соответствующий возможностям потока среды выполнения Windows, который требуется преобразовать. Однако, поскольку IRandomAccessStream доступен для чтения и записи (он реализует как IOutputStream, так и IInputStream), методы преобразования поддерживают возможности исходного потока. Например, использование WindowsRuntimeStreamExtensions.AsStreamForRead для преобразования IRandomAccessStream не ограничивает преобразованный поток .NET Framework только возможностью чтения. Он также доступен для записи.
Пример. Преобразование случайного доступа среды выполнения Windows в поток .NET Framework
Чтобы преобразовать поток случайного доступа среды выполнения Windows в поток .NET Framework, используйте метод WindowsRuntimeStreamExtensions.AsStream.
В следующем примере кода предлагается выбрать файл, открыть его с помощью API среды выполнения Windows, а затем преобразовать его в поток .NET Framework. Он считывает поток и выводит его в текстовый блок. Обычно поток будет управляться с помощью API .NET Framework, прежде чем выводить результаты.
// 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 методов:
WindowsRuntimeStreamExtensions.AsInputStream Преобразует управляемый поток в .NET для приложений UWP в входной поток в среде выполнения Windows.
WindowsRuntimeStreamExtensions.AsOutputStream Преобразует управляемый поток в .NET для приложений UWP в выходной поток в среде выполнения Windows.
WindowsRuntimeStreamExtensions.AsRandomAccessStream Преобразует управляемый поток в .NET для приложений UWP в поток случайного доступа, который среда выполнения Windows может использовать для чтения или записи.
При преобразовании потока .NET Framework в поток среды выполнения Windows возможности преобразованного потока зависят от исходного потока. Например, если исходный поток поддерживает чтение и запись, и вызывается WindowsRuntimeStreamExtensions.AsInputStream для преобразования потока, возвращаемый тип является .IRandomAccessStream
IRandomAccessStream реализует IInputStream и IOutputStream, и поддерживает чтение и запись.
Потоки .NET Framework не поддерживают клонирование даже после преобразования. При преобразовании потока .NET Framework в поток среды выполнения Windows и вызове GetInputStreamAt или GetOutputStreamAt (которые в свою очередь вызывают CloneStream), или при прямом вызове CloneStream, возникает исключение.
Пример. Преобразование .NET Framework в поток случайного доступа среды выполнения Windows
Чтобы преобразовать поток .NET Framework в поток случайного доступа Windows Runtime, используйте метод 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://dori-uw-1.kuma-moon.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;