c# – zip中的Zip打开到未记录的System.IO.Compression.SubReadStream
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – zip中的Zip打开到未记录的System.IO.Compression.SubReadStream,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2248字,纯文字阅读大概需要4分钟。
内容图文
![c# – zip中的Zip打开到未记录的System.IO.Compression.SubReadStream](/upload/InfoBanner/zyjiaocheng/796/86d4fd5174d94111ae290247e79790a5.jpg)
我有一个函数用于聚合来自zip存档的流.
private void ExtractMiscellaneousFiles()
{
foreach (var miscellaneousFileName in _fileData.MiscellaneousFileNames)
{
var fileEntry = _archive.GetEntry(miscellaneousFileName);
if (fileEntry == null)
{
throw new ZipArchiveMissingFileException("Couldn't find " + miscellaneousFileName);
}
var stream = fileEntry.Open();
OtherFileStreams.Add(miscellaneousFileName, (DeflateStream) stream);
}
}
这在大多数情况下效果很好.但是,如果我在zip中有一个zip,我会将流转换为DeflateStream:
System.InvalidCastException: Unable to cast object of type ‘System.IO.Compression.SubReadStream’ to type ‘System.IO.Compression.DeflateStream’.
我无法找到SubReadStream的Microsoft文档.我希望我的拉链内拉链作为DeflateStream.这可能吗?如果是这样的话?
UPDATE
仍然没有成功.我试图@ Sunshine建议使用以下代码复制流:
private void ExtractMiscellaneousFiles()
{
_logger.Log("Extracting misc files...");
foreach (var miscellaneousFileName in _fileData.MiscellaneousFileNames)
{
_logger.Log($"Opening misc file stream for {miscellaneousFileName}");
var fileEntry = _archive.GetEntry(miscellaneousFileName);
if (fileEntry == null)
{
throw new ZipArchiveMissingFileException("Couldn't find " + miscellaneousFileName);
}
var openStream = fileEntry.Open();
var deflateStream = openStream;
if (!(deflateStream is DeflateStream))
{
var memoryStream = new MemoryStream();
deflateStream.CopyTo(memoryStream);
memoryStream.Position = 0;
deflateStream = new DeflateStream(memoryStream, CompressionLevel.NoCompression, true);
}
OtherFileStreams.Add(miscellaneousFileName, (DeflateStream)deflateStream);
}
}
但我得到了一个
System.NotSupportedException: Stream does not support reading.
我检查了deflateStream.CanRead,这是真的.
我发现这不仅发生在拉链上,而且发生在zip文件中但未压缩的文件中(例如,因为太小).当然有办法解决这个问题;肯定有人以前遇到过这个.我正在打开这个问题的赏金.
感谢@Quantic,这是SubReadStream的.NET source.
解决方法:
ZipArchiveEntry.Open()的返回类型是Stream.一个抽象类型,在实践中它可以是DeflateStream(你会很高兴),SubReadStream(boo)或WrappedStream(boo).如果他们决定某天改进课程并使用ZopfliStream(嘘),那么你会有祸了吗?解决方法不好,您正试图收缩未压缩的数据(boo).
嘘声太多了.
唯一好的解决方案是更改OtherFileStreams成员的类型.我们看不到它,闻起来像List< DeflateStream>.它需要是List< Stream>.
内容总结
以上是互联网集市为您收集整理的c# – zip中的Zip打开到未记录的System.IO.Compression.SubReadStream全部内容,希望文章能够帮你解决c# – zip中的Zip打开到未记录的System.IO.Compression.SubReadStream所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。