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

59 lines
1.7 KiB
C#
Raw Normal View History

2015-12-30 11:19:42 +00:00
using System.IO;
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;
namespace SharpCompress.Common.Zip
{
2020-05-23 16:27:55 -07:00
internal sealed class StreamingZipFilePart : ZipFilePart
2015-12-30 11:19:42 +00:00
{
2020-05-23 16:27:55 -07:00
private Stream? _decompressionStream;
2015-12-30 11:19:42 +00:00
internal StreamingZipFilePart(ZipFileEntry header, Stream stream)
: base(header, stream)
{
}
protected override Stream CreateBaseStream()
{
return Header.PackedStream;
}
internal override Stream GetCompressedStream()
{
if (!Header.HasData)
{
return Stream.Null;
}
2018-05-06 08:59:00 +01:00
_decompressionStream = CreateDecompressionStream(GetCryptoStream(CreateBaseStream()), Header.CompressionMethod);
2015-12-30 11:19:42 +00:00
if (LeaveStreamOpen)
{
2018-05-06 08:59:00 +01:00
return new NonDisposingStream(_decompressionStream);
2015-12-30 11:19:42 +00:00
}
2018-05-06 08:59:00 +01:00
return _decompressionStream;
2015-12-30 11:19:42 +00:00
}
internal BinaryReader FixStreamedFileLocation(ref RewindableStream rewindableStream)
{
if (Header.IsDirectory)
{
return new BinaryReader(rewindableStream);
}
if (Header.HasData && !Skipped)
2015-12-30 11:19:42 +00:00
{
2020-05-23 16:27:55 -07:00
_decompressionStream ??= GetCompressedStream();
2021-01-09 13:33:34 +00:00
2018-05-06 08:59:00 +01:00
_decompressionStream.Skip();
2015-12-30 11:19:42 +00:00
2020-05-23 16:27:55 -07:00
if (_decompressionStream is DeflateStream deflateStream)
2015-12-30 11:19:42 +00:00
{
rewindableStream.Rewind(deflateStream.InputBuffer);
}
Skipped = true;
2015-12-30 11:19:42 +00:00
}
var reader = new BinaryReader(rewindableStream);
2018-05-06 08:59:00 +01:00
_decompressionStream = null;
2015-12-30 11:19:42 +00:00
return reader;
}
}
2013-04-28 12:32:55 +01:00
}