gpt4 book ai didi

c# - Zip 中的 Zip 打开到未记录的 System.IO.Compression.SubReadStream

转载 作者:太空狗 更新时间:2023-10-30 01:01:16 30 4
gpt4 key购买 nike

我有一个函数用于从 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 文档。我想将我的 zip 压缩为 DeflateStream。这可能吗?如果是怎么办?

更新

还是没有成功。我尝试了@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 上,而且发生在 zip 中但未压缩的文件上(例如,因为太小)。当然有办法解决这个问题;肯定有人以前遇到过这个。我正在为这个问题悬赏。

这是 .NET source对于 SubReadStream,感谢@Quantic。

最佳答案

ZipArchiveEntry.Open() 的返回类型是Stream .一种抽象类型,实际上它可以是 DeflateStream(您会很高兴)、SubReadStream (boo) 或 WrappedStream (boo)。如果他们有一天决定改进类(class)并使用 ZopfliStream (boo),你会很不幸。解决方法不好,您正在尝试压缩未压缩的数据 (boo)。

嘘声太多了。

唯一好的解决方案是更改 OtherFileStreams 的类型成员。我们看不到它,闻起来像 List<DeflateStream> .它需要是 List<Stream> .

关于c# - Zip 中的 Zip 打开到未记录的 System.IO.Compression.SubReadStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292846/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com