Merge feature/sevenzip-writer-lzma - use CompressionType enum, default LZMA2

This commit is contained in:
Daniil Bystrukhin
2026-02-22 21:19:13 -06:00
5 changed files with 32 additions and 17 deletions

View File

@@ -9,6 +9,7 @@ public enum CompressionType
Deflate,
Rar,
LZMA,
LZMA2,
BCJ,
BCJ2,
LZip,

View File

@@ -29,14 +29,15 @@ internal sealed class SevenZipStreamsCompressor(Stream outputStream)
/// Returns a PackedStream containing folder metadata, compressed size, and CRCs.
/// </summary>
/// <param name="inputStream">Uncompressed data to compress.</param>
/// <param name="isLzma2">True for LZMA2, false for LZMA.</param>
/// <param name="compressionType">Compression method (LZMA or LZMA2).</param>
/// <param name="encoderProperties">LZMA encoder properties (null for defaults).</param>
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;

View File

@@ -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
);

View File

@@ -15,12 +15,22 @@ public sealed record SevenZipWriterOptions : IWriterOptions
private int _compressionLevel;
/// <summary>
/// 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).
/// </summary>
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;
}
}
/// <summary>
@@ -54,11 +64,6 @@ public sealed record SevenZipWriterOptions : IWriterOptions
public CompressionProviderRegistry Providers { get; init; } =
CompressionProviderRegistry.Default;
/// <summary>
/// Whether to use LZMA2 instead of LZMA. Default is false (LZMA).
/// </summary>
public bool IsLzma2 { get; init; }
/// <summary>
/// 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; }
/// <summary>
/// Creates a new SevenZipWriterOptions instance with LZMA compression.
/// Creates a new SevenZipWriterOptions instance with LZMA2 compression (default).
/// </summary>
public SevenZipWriterOptions()
{
CompressionType = CompressionType.LZMA;
CompressionType = CompressionType.LZMA2;
}
/// <summary>

View File

@@ -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<ArgumentException>(
() => new SevenZipWriterOptions(CompressionType.Deflate)
);
}
[Fact]
public void SevenZipWriter_UncompressedHeader_RoundTrip()
{