From bcf628568c6140fa7f1c96f1a412bd8b605fcb9e Mon Sep 17 00:00:00 2001 From: Daniil Bystrukhin Date: Sun, 22 Feb 2026 21:08:34 -0600 Subject: [PATCH 1/2] Replace IsLzma2 flag with CompressionType enum for 7z writer API consistency --- src/SharpCompress/Common/CompressionType.cs | 1 + .../Writers/SevenZip/SevenZipWriter.cs | 8 -------- .../Writers/SevenZip/SevenZipWriterOptions.cs | 19 ++++++++++++------- .../SevenZip/SevenZipWriterTests.cs | 10 ++-------- 4 files changed, 15 insertions(+), 23 deletions(-) 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/Writers/SevenZip/SevenZipWriter.cs b/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs index 1ed4ed46..3a371df3 100644 --- a/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs +++ b/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs @@ -74,14 +74,6 @@ public partial class SevenZipWriter : AbstractWriter } // Compress file data to output stream - // TODO: LZMA2 encoding is not yet implemented in SharpCompress's LzmaStream - if (sevenZipOptions.IsLzma2) - { - throw new ArchiveOperationException( - "LZMA2 encoding is not yet implemented. Use LZMA (IsLzma2 = false) instead." - ); - } - var compressor = new SevenZipStreamsCompressor(OutputStream.NotNull()); var packed = compressor.Compress( progressStream, diff --git a/src/SharpCompress/Writers/SevenZip/SevenZipWriterOptions.cs b/src/SharpCompress/Writers/SevenZip/SevenZipWriterOptions.cs index 65202d20..cba89e6a 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. Only LZMA is supported in this version. /// public CompressionType CompressionType { get => _compressionType; - init => _compressionType = value; + init + { + if (value != CompressionType.LZMA) + { + throw new ArgumentException( + $"SevenZipWriter only supports CompressionType.LZMA. 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. diff --git a/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs b/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs index 5e74bb61..4a7c58b1 100644 --- a/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs +++ b/tests/SharpCompress.Test/SevenZip/SevenZipWriterTests.cs @@ -162,15 +162,9 @@ public class SevenZipWriterTests : TestBase [Fact] public void SevenZipWriter_LZMA2_ThrowsNotSupported() { - // LZMA2 encoding is not yet implemented in SharpCompress's LzmaStream - using var archiveStream = new MemoryStream(); - using var writer = new SevenZipWriter( - archiveStream, - new SevenZipWriterOptions { IsLzma2 = true } + Assert.Throws( + () => new SevenZipWriterOptions(CompressionType.LZMA2) ); - - using var source = new MemoryStream("test"u8.ToArray()); - Assert.Throws(() => writer.Write("test.txt", source, DateTime.UtcNow)); } [Fact] From 97b8a93a0c26c5191ef30ee65ad78077dd8ec363 Mon Sep 17 00:00:00 2001 From: Daniil Bystrukhin Date: Sun, 22 Feb 2026 21:15:17 -0600 Subject: [PATCH 2/2] Pass CompressionType through compressor instead of bool isLzma2 --- .../Common/SevenZip/SevenZipStreamsCompressor.cs | 5 +++-- src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SharpCompress/Common/SevenZip/SevenZipStreamsCompressor.cs b/src/SharpCompress/Common/SevenZip/SevenZipStreamsCompressor.cs index 44241c24..aa14f3bf 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: true); var outStartOffset = outputStream.Position; diff --git a/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs b/src/SharpCompress/Writers/SevenZip/SevenZipWriter.cs index 3a371df3..0d14c130 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: false, + CompressionType.LZMA, 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 );