私はzipアーカイブからストリームを集約するために使用する関数を持っています。zip内のジップがドキュメント化されていない状態で開きます。System.IO.Compression.SubReadStream
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を持っている場合は、私がDeflateStream
にストリームをキャストにexcpetionを取得:
System.InvalidCastExceptionの:型のオブジェクトをキャストすることができません「System.IO.Compression.SubReadStream」とタイプします'System.IO.Compression.DeflateStream'。
SubReadStream
のMicrosoftドキュメントが見つかりません。私はジップの中で私のジップをDeflateStream
としたいと思います。これは可能ですか?もしそうなら、どのように?
UPDATE
まだない成功。私は、次のコードを使用してストリームをコピーするのサンシャインの提案@未遂:
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
を検査したが、それは真である。
これは、ジップだけでなく、圧縮されていない(たとえば小さすぎるなどの理由で)ジップ内にあるファイルで発生することがわかりました。確かにこれに対処する方法があります。確かに誰かがこれに遭遇しました。私はこの質問の恩恵を受けています。
SubReadStream
の.NET sourceは@Quanticのおかげです。
「_archive」のタイプは何ですか? – Quantic
'System.IO.Compression.ZipArchive'。ありがとう。 –
.NETコアである必要があります:https://github.com/dotnet/corefx/blob/bffef76f6af208e2042a2f27bc081ee908bb390b/src/System.IO.Compression/src/System/IO/Compression/ZipCustomStreams.cs – Quantic