Files
sharpcompress/src/SharpCompress/Common/Zip/StreamingZipFilePart.cs

62 lines
1.7 KiB
C#
Raw Normal View History

2022-06-19 22:05:52 +02:00
using System.IO;
2015-12-30 11:19:42 +00:00
using SharpCompress.Common.Zip.Headers;
2016-09-26 11:49:49 +01:00
using SharpCompress.Compressors.Deflate;
2015-12-30 11:19:42 +00:00
using SharpCompress.IO;
2022-12-20 15:06:44 +00:00
namespace SharpCompress.Common.Zip;
internal sealed class StreamingZipFilePart : ZipFilePart
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
private Stream? _decompressionStream;
2015-12-30 11:19:42 +00:00
2023-03-21 13:14:08 +00:00
internal StreamingZipFilePart(ZipFileEntry header, Stream stream)
: base(header, stream) { }
2022-12-20 15:06:44 +00:00
2024-04-18 14:25:10 +01:00
protected override Stream CreateBaseStream() => Header.PackedStream.NotNull();
2015-12-30 11:19:42 +00:00
2022-12-20 15:06:44 +00:00
internal override Stream GetCompressedStream()
{
if (!Header.HasData)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
return Stream.Null;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
_decompressionStream = CreateDecompressionStream(
GetCryptoStream(CreateBaseStream()),
Header.CompressionMethod
);
if (LeaveStreamOpen)
2015-12-30 11:19:42 +00:00
{
return SharpCompressStream.Create(_decompressionStream, leaveOpen: true);
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
return _decompressionStream;
}
2015-12-30 11:19:42 +00:00
internal BinaryReader FixStreamedFileLocation(ref SharpCompressStream rewindableStream)
2022-12-20 15:06:44 +00:00
{
if (Header.IsDirectory)
{
return new BinaryReader(rewindableStream);
}
2022-12-20 15:06:44 +00:00
if (Header.HasData && !Skipped)
2015-12-30 11:19:42 +00:00
{
2022-12-20 15:06:44 +00:00
_decompressionStream ??= GetCompressedStream();
_decompressionStream.Skip();
2022-12-20 15:06:44 +00:00
// If we had TotalIn / TotalOut we could have used them
Header.CompressedSize = _decompressionStream.Position;
2022-12-20 15:06:44 +00:00
if (_decompressionStream is DeflateStream deflateStream)
2015-12-30 11:19:42 +00:00
{
((IStreamStack)rewindableStream).StackSeek(0);
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
Skipped = true;
2015-12-30 11:19:42 +00:00
}
2022-12-20 15:06:44 +00:00
var reader = new BinaryReader(rewindableStream);
_decompressionStream = null;
return reader;
2015-12-30 11:19:42 +00:00
}
2022-06-19 22:05:52 +02:00
}