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年后,这仍然是一个有用的帖子。