mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-09-23 15:34:34 +00:00
Merge feature/sevenzip-writer-lzma - use CompressionType enum, default LZMA2
This commit is contained in:
@@ -9,6 +9,7 @@ public enum CompressionType
|
||||
Deflate,
|
||||
Rar,
|
||||
LZMA,
|
||||
LZMA2,
|
||||
BCJ,
|
||||
BCJ2,
|
||||
LZip,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user