我有一个用于聚合 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,我会在将流转换为 a 时得到一个例外DeflateStream
:
System.InvalidCastException:无法将“System.IO.Compression.SubReadStream”类型的对象转换为“System.IO.Compression.DeflateStream”类型。
我无法找到 Microsoft 文档SubReadStream
。我希望我的 zip 在一个 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:流不支持读取。
我检查deflateStream.CanRead
了,这是真的。
我发现这不仅发生在 zip 上,还发生在 zip 中但未压缩的文件上(例如,因为太小)。当然有办法解决这个问题;肯定有人以前遇到过这种情况。我在这个问题上悬赏。
这是.NET 的源代码,SubReadStream
感谢@Quantic。