C# Stream.copy不复制任何流数据

C# Stream.copy不复制任何流数据,c#,stream,zip,memorystream,C#,Stream,Zip,Memorystream,我在将数据从MemoryStream复制到ZipArchive内的流中时遇到问题。以下内容不起作用-它仅返回114个字节: GetDataAsByteArray(IDataSource dataSource) { using (var zipStream = new MemoryStream()) { using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))

我在将数据从
MemoryStream
复制到
ZipArchive
内的
流中时遇到问题。以下内容不起作用-它仅返回114个字节:

GetDataAsByteArray(IDataSource dataSource)
{
    using (var zipStream = new MemoryStream())
    {
        using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, true))
        {
            var file = archive.CreateEntry("compressed.file");
            using (var targetStream = file.Open())
            {
                using (var sourceStream = new MemoryStream())
                {
                    await dataSource.LoadIntoStream(sourceStream);
                    sourceStream.CopyTo(targetStream);
                }
            }
        }
        var result = zipStream.ToArray();
        zipStream.Close();
        return result;
    }
}
但是,使用下面的“复制”过程实现,所有1103字节都会写入阵列/内存流:

await targetStream.WriteAsync(sourceStream.ToArray(), 0, (int) sourceStream.Length);
我想知道为什么
CopyTo
产生的字节更少。另外,在第二个实现中,我觉得转换为
Int32
不安全


FYI:比较字节数组:看起来只有zip文件的页眉和页脚是由第一个实现写入的。

在复制之前设置
sourceStream.Position=0
。复制将从当前位置复制到流的末尾。

stream.CopyTo()开始从流的当前位置复制。在LoadIntoStream()调用之后,它可能不是0。由于它是一个MemoryStream,您可以这样简单地修复它:

    await dataSource.LoadIntoStream(sourceStream);
    sourceStream.Position = 0;
    sourceStream.CopyTo(targetStream);

正如其他人所说,
位置
可能不再是0。但是,对于网络和压缩流,您不能总是将
位置设置回0。在执行任何操作之前,应检查
stream.CanSeek
属性,如果
false
,则首先将流复制到新的MemoryStream(可以查找)然后在每次更改位置的操作后,将
位置设置回0。

最初的问题是,由于位置的原因,复制无法工作。所以你建议先复制它:D?还是我遗漏了什么?@fl034首先将其复制到内存流,然后使用内存流而不是原始流。不,首先对它做一些改变位置的事情,然后尝试从原始流复制它。那不行。谢谢你,汉斯!!6年后,这仍然是一个有用的帖子。