방법: .NET Framework와 Windows 런타임 스트림 간의 변환(Windows에만 해당)
UWP 앱용 .NET Framework는 전체 .NET Framework의 하위 집합입니다. UWP 앱에 대한 보안과 기타 요구 사항 때문에, 전체 .NET Framework API 세트를 사용하여 파일을 열고 읽을 수는 없습니다. 자세한 내용은 UWP 앱용 .NET 개요를 참조하세요. 그러나 다른 스트림 조작 작업에 대한 .NET Framework API를 사용하고 싶을 수 있습니다. 관련 스트림을 조작하려면 MemoryStream 또는 FileStream과 같은 .NET Framework 스트림 형식과 IInputStream,IOutputStream 또는 IRandomAccessStream과 같은 Windows 런타임 스트림 간에 변환하면 됩니다.
System.IO.WindowsRuntimeStreamExtensions 클래스는 이러한 변환을 쉽게 하는 메서드를 포함합니다. 하지만 .NET Framework와 Windows 런타임 스트림의 근본적인 차이점은 이러한 메서드를 사용한 결과에 영향을 미치며, 다음 섹션에 설명되어 있습니다.
Windows 런타임에서 .NET Framework 스트림으로 변환
Windows 런타임 스트림에서 .NET Framework 스트림으로 변환하려면 다음 System.IO.WindowsRuntimeStreamExtensions 메서드 중 하나를 사용하세요.
WindowsRuntimeStreamExtensions.AsStream은 Windows 런타임의 임의 액세스 스트림을 UWP용 .NET 앱의 관리형 스트림으로 변환합니다.
WindowsRuntimeStreamExtensions.AsStreamForWrite은 Windows 런타임의 출력 스트림을 UWP용 .NET 앱의 관리형 스트림으로 변환합니다.
WindowsRuntimeStreamExtensions.AsStreamForRead은 Windows 런타임의 입력 스트림을 UWP용 .NET 앱의 관리형 스트림으로 변환합니다.
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 메서드를 사용하세요.
다음 코드 예제는 파일을 선택하라는 메시지를 표시하고 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 메서드 중 하나를 사용하세요.
WindowsRuntimeStreamExtensions.AsInputStream은 UWP용 .NET 앱의 관리형 스트림을 Windows 런타임의 입력 스트림으로 변환합니다.
WindowsRuntimeStreamExtensions.AsOutputStream은 UWP용 .NET 앱의 관리형 스트림을 Windows 런타임의 출력 스트림으로 변환합니다.
WindowsRuntimeStreamExtensions.AsRandomAccessStream은 UWP 앱용 .NET의 관리형 스트림을 Windows 런타임에서 읽거나 쓰는 데 사용할 수 있는 임의 액세스 스트림으로 변환합니다.
.NET Framework 스트림을 Windows 런타임 스트림으로 변환할 때 변환된 스트림의 기능은 원본 스트림에 따라 다릅니다. 예를 들어 원본 스트림이 읽기와 쓰기를 모두 지원하는 경우 WindowsRuntimeStreamExtensions.AsInputStream을 호출하여 스트림을 변환하면, 반환되는 형식은 IRandomAccessStream
입니다. IRandomAccessStream
은 IInputStream
과 IOutputStream
을 구현하고 읽기와 쓰기를 지원합니다.
.NET Framework 스트림은 변환 후에도 복제를 지원하지 않습니다. .NET Framework 스트림을 Windows 런타임 스트림으로 변환하고 CloneStream을 호출하는 GetInputStreamAt 또는 GetOutputStreamAt을 호출하거나 CloneStream을 직접 호출하면 예외가 발생합니다.
예: .NET Framework를 Windows 런타임 임의 액세스 스트림으로 변환
.NET Framework 스트림을 Windows 런타임 임의 액세스 스트림으로 변환하려면 다음 예제와 같이 AsRandomAccessStream 메서드를 사용합니다.
Important
사용 중인 .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;
참고 항목
.NET