diff --git a/src/SharpCompress/Common/CompressionType.cs b/src/SharpCompress/Common/CompressionType.cs index 59583423..f9b63855 100644 --- a/src/SharpCompress/Common/CompressionType.cs +++ b/src/SharpCompress/Common/CompressionType.cs @@ -9,6 +9,7 @@ public enum CompressionType Deflate, Rar, LZMA, + LZMA2, BCJ, BCJ2, LZip, diff --git a/src/SharpCompress/Common/SevenZip/SevenZipStreamsCompressor.cs b/src/SharpCompress/Common/SevenZip/SevenZipStreamsCompressor.cs index 6b17a064..636fdfb0 100644 --- a/src/SharpCompress/Common/SevenZip/SevenZipStreamsCompressor.cs +++ b/src/SharpCompress/Common/SevenZip/SevenZipStreamsCompressor.cs @@ -29,14 +29,15 @@ internal sealed class SevenZipStreamsCompressor(Stream outputStream) /// Returns a PackedStream containing folder metadata, compressed size, and CRCs. /// /// Uncompressed data to compress. - /// True for LZMA2, false for LZMA. + /// Compression method (LZMA or LZMA2). /// LZMA encoder properties (null for defaults). public PackedStream Compress( Stream inputStream, - bool isLzma2, + CompressionType compressionType, LzmaEncoderProperties? encoderProperties = null ) { + var isLzma2 = compressionType == CompressionType.LZMA2; encoderProperties ??= new LzmaEncoderProperties(eos: !isLzma2); var outStartOffset = outputStream.Position; diff --git a/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs b/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs index ae42318f..740f7a65 100644 --- a/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs +++ b/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs @@ -77,7 +77,7 @@ public partial class SevenZipWriter : AbstractWriter var compressor = new SevenZipStreamsCompressor(OutputStream.NotNull()); var packed = compressor.Compress( progressStream, - isLzma2: sevenZipOptions.IsLzma2, + sevenZipOptions.CompressionType, sevenZipOptions.LzmaProperties ); packedStreams.Add(packed); @@ -161,7 +161,7 @@ public partial class SevenZipWriter : AbstractWriter var headerCompressor = new SevenZipStreamsCompressor(output); var headerPacked = headerCompressor.Compress( rawHeaderStream, - isLzma2: false, + CompressionType.LZMA, sevenZipOptions.LzmaProperties ); diff --git a/src/SharpCompress/Writers/SevenZip/SevenZipWriterOptions.cs b/src/SharpCompress/Writers/SevenZip/SevenZipWriterOptions.cs index 65202d20..033f07fd 100644 --- a/src/SharpCompress/Writers/SevenZip/SevenZipWriterOptions.cs +++ b/src/SharpCompress/Writers/SevenZip/SevenZipWriterOptions.cs @@ -15,12 +15,22 @@ public sealed record SevenZipWriterOptions : IWriterOptions private int _compressionLevel; /// - /// The compression type to use. Supported: LZMA (default), LZMA2 (via CompressionType.LZMA with IsLzma2=true). + /// The compression type to use. Supported: LZMA and LZMA2 (default). /// public CompressionType CompressionType { get => _compressionType; - init => _compressionType = value; + init + { + if (value != CompressionType.LZMA && value != CompressionType.LZMA2) + { + throw new ArgumentException( + $"SevenZipWriter only supports CompressionType.LZMA and CompressionType.LZMA2. Got: {value}", + nameof(value) + ); + } + _compressionType = value; + } } /// @@ -54,11 +64,6 @@ public sealed record SevenZipWriterOptions : IWriterOptions public CompressionProviderRegistry Providers { get; init; } = CompressionProviderRegistry.Default; - /// - /// Whether to use LZMA2 instead of LZMA. Default is false (LZMA). - /// - public bool IsLzma2 { get; init; } - /// /// Whether to compress the archive header itself using LZMA. /// Default is true, matching standard 7-Zip behavior. @@ -71,11 +76,11 @@ public sealed record SevenZipWriterOptions : IWriterOptions public LzmaEncoderProperties? LzmaProperties { get; init; } /// - /// Creates a new SevenZipWriterOptions instance with LZMA compression. + /// Creates a new SevenZipWriterOptions instance with LZMA2 compression (default). /// public SevenZipWriterOptions() { - CompressionType = CompressionType.LZMA; + CompressionType = CompressionType.LZMA2; } /// diff --git a/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs b/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs index 43aa6dc6..8f6fdec5 100644 --- a/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs +++ b/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs @@ -168,7 +168,7 @@ public class SevenZipWriterTests : TestBase using (var writer = new SevenZipWriter( archiveStream, - new SevenZipWriterOptions { IsLzma2 = true } + new SevenZipWriterOptions(CompressionType.LZMA2) )) { using var source = new MemoryStream(content); @@ -206,7 +206,7 @@ public class SevenZipWriterTests : TestBase using (var writer = new SevenZipWriter( archiveStream, - new SevenZipWriterOptions { IsLzma2 = true } + new SevenZipWriterOptions(CompressionType.LZMA2) )) { foreach (var (name, text) in files) @@ -251,7 +251,7 @@ public class SevenZipWriterTests : TestBase using (var writer = new SevenZipWriter( archiveStream, - new SevenZipWriterOptions { IsLzma2 = true } + new SevenZipWriterOptions(CompressionType.LZMA2) )) { using var source = new MemoryStream(content); @@ -288,7 +288,7 @@ public class SevenZipWriterTests : TestBase using (var writer = new SevenZipWriter( archiveStream, - new SevenZipWriterOptions { IsLzma2 = true } + new SevenZipWriterOptions(CompressionType.LZMA2) )) { using var source = new MemoryStream(content); @@ -311,6 +311,14 @@ public class SevenZipWriterTests : TestBase } } + [Fact] + public void SevenZipWriter_UnsupportedCompressionType_Throws() + { + Assert.Throws( + () => new SevenZipWriterOptions(CompressionType.Deflate) + ); + } + [Fact] public void SevenZipWriter_UncompressedHeader_RoundTrip() {