这是在 Universal App Windows 10 中将流保存到文件的好方法吗?

Is this a good way to save stream to file in Universal App, Windows 10?

我使用此代码将流保存到文件

StorageFolder coverImageFolder = await StorageFolder.GetFolderFromPathAsync(AppInfo.LF_CoverFolder_Path);
string coverName = System.IO.Path.GetRandomFileName();

// Create an instance of ArchiveReader.
ArchiveReader reader = new ArchiveReader(pickedFile);

// Get a first image (stream) from archive.
using (var imageStream = await reader.GetFirstEntryStream()) { // IRandomAccessStream

// Save ImageStream to 'CoverImage' folder
StorageFile coverFile = await coverImageFolder.CreateFileAsync(coverName);

var coverStream = await coverFile.OpenAsync(FileAccessMode.ReadWrite); // IRandomAccessStream
using (var coverOutputStream = coverStream.AsStreamForWrite()) { // Stream
      using (var imageInputStream = imageStream.AsStreamForRead()) { // Stream
           await imageInputStream.CopyToAsync(coverOutputStream);
           await coverOutputStream.FlushAsync();
      }
}

它正常工作。但是,我想知道这是将 .NET 流保存到 Universal App 文件的好方法还是正确方法?

如果我没理解错的话,您是想将 imageStream(IRandomAccessStream) 保存到 coverFile(StrorageFile)。

AsStreamForWrite 和 AsStreamForRead 都是 .NET 中的 Windows 运行时扩展方法。在这种情况下,您不需要将 Windows Runtime Stream 转换为 .NET IO 流(这将需要一些额外的性能成本)。我建议您使用以下方式(不使用 .NET class 库)。

        var src = await KnownFolders
                        .PicturesLibrary
                        .GetFileAsync("210644575939381015.jpg")
                        .AsTask();

        var target = await KnownFolders
                        .PicturesLibrary
                        .CreateFileAsync("new_file.jpg")
                        .AsTask();


        using (var srcStream = await src.OpenAsync(FileAccessMode.Read))
        using (var targetStream = await target.OpenAsync(FileAccessMode.ReadWrite))
        using (var reader = new DataReader(srcStream.GetInputStreamAt(0)))
        {


            var output = targetStream.GetOutputStreamAt(0);

            await reader.LoadAsync((uint)srcStream.Size);

            while (reader.UnconsumedBufferLength > 0)
            {
                uint dataToRead = reader.UnconsumedBufferLength > 64
                                    ? 64
                                    : reader.UnconsumedBufferLength;

                IBuffer buffer = reader.ReadBuffer(dataToRead);

                await output.WriteAsync(buffer);
            }

            await output.FlushAsync();
        }