입력으로 System.IO.Stream을 가져 와서 파일에서 데이터를 쓰는 데 사용하는 메서드가 필요합니다. 나는 사이클 (첫번째 읽기) 동안의 데이터를 읽을 때 (범위의 출력) 예외가 발생되어,WinRT에서 스트림에서 파일로 데이터를 저장하는 방법은 무엇입니까?
public async Task SaveStreamToFileX(Stream stream, string filePath, IProgress<long> progress)
{
var folder = await StorageFolder.GetFolderFromPathAsync(Path.GetDirectoryName(filePath));
var fileName = Path.GetFileName(filePath);
StorageFile file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
var istream = stream.AsInputStream();
var canRead = stream.CanRead; //this returns true
using (var reader = new DataReader(istream))
{
using (IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
using (IOutputStream outputStream = fileStream.GetOutputStreamAt(0))
{
using (DataWriter writer = new DataWriter(outputStream))
{
IBuffer buffer;
long readBytes = 0;
const int bufferSize = 8192;
while ((buffer = reader.ReadBuffer(bufferSize)).Length > 0) //exception System.Exception with message: Out of range ...
{
writer.WriteBuffer(buffer);
readBytes += bufferSize;
progress.Report(readBytes);
}
}
}
}
}
}
문제 : 지금까지 나는 다음 있습니다. 스트림에는 데이터가 있어야합니다. 나는 누군가가 더 나은 해결책을 갖고 있다면 그렇게 긴 코드가 필요하다고 확신하지 못한다. 사이드 노트 : await reader.LoadAsync(50)
을 시도하면 50을 반환합니다. LoadAsync가 어떤 작업을해야하는지 잘 모르겠습니다. 읽기 전에 데이터를 준비하기 전에 호출해야할까요? 이 문제를 자세히 조사 할 것입니다 ... 또한 Stream.CanRead는 true를 반환합니다.