Files
sharpcompress/src/SharpCompress/Factories/SevenZipFactory.cs
2026-04-27 17:17:31 +01:00

170 lines
4.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using SharpCompress.Archives;
using SharpCompress.Archives.SevenZip;
using SharpCompress.Common;
using SharpCompress.Common.Options;
using SharpCompress.IO;
using SharpCompress.Readers;
using SharpCompress.Writers;
using SharpCompress.Writers.SevenZip;
namespace SharpCompress.Factories;
/// <summary>
/// Represents the foundation factory of 7Zip archive.
/// </summary>
public class SevenZipFactory : Factory, IArchiveFactory, IMultiArchiveFactory, IWriterFactory
{
#region IFactory
/// <inheritdoc/>
public override string Name => "7Zip";
/// <inheritdoc/>
public override ArchiveType? KnownArchiveType => ArchiveType.SevenZip;
/// <inheritdoc/>
public override IEnumerable<string> GetSupportedExtensions()
{
yield return "7z";
}
/// <inheritdoc/>
public override bool IsArchive(Stream stream, ReaderOptions readerOptions) =>
SevenZipArchive.IsSevenZipFile(stream, readerOptions);
/// <inheritdoc/>
public override ValueTask<bool> IsArchiveAsync(
Stream stream,
ReaderOptions readerOptions,
CancellationToken cancellationToken = default
) => SevenZipArchive.IsSevenZipFileAsync(stream, readerOptions, cancellationToken);
#endregion
#region IArchiveFactory
/// <inheritdoc/>
public IArchive OpenArchive(Stream stream, ReaderOptions? readerOptions = null) =>
SevenZipArchive.OpenArchive(stream, readerOptions);
/// <inheritdoc/>
public ValueTask<IAsyncArchive> OpenAsyncArchive(
Stream stream,
ReaderOptions? readerOptions = null,
CancellationToken cancellationToken = default
)
{
cancellationToken.ThrowIfCancellationRequested();
return new((IAsyncArchive)OpenArchive(stream, readerOptions));
}
/// <inheritdoc/>
public IArchive OpenArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) =>
SevenZipArchive.OpenArchive(fileInfo, readerOptions);
/// <inheritdoc/>
public ValueTask<IAsyncArchive> OpenAsyncArchive(
FileInfo fileInfo,
ReaderOptions? readerOptions = null,
CancellationToken cancellationToken = default
)
{
cancellationToken.ThrowIfCancellationRequested();
return new((IAsyncArchive)OpenArchive(fileInfo, readerOptions));
}
#endregion
#region IMultiArchiveFactory
/// <inheritdoc/>
public IArchive OpenArchive(
IReadOnlyList<Stream> streams,
ReaderOptions? readerOptions = null
) => SevenZipArchive.OpenArchive(streams, readerOptions);
/// <inheritdoc/>
public async ValueTask<IAsyncArchive> OpenAsyncArchive(
IReadOnlyList<Stream> streams,
ReaderOptions? readerOptions = null,
CancellationToken cancellationToken = default
)
{
cancellationToken.ThrowIfCancellationRequested();
return await SevenZipArchive
.OpenAsyncArchive(streams, readerOptions, cancellationToken)
.ConfigureAwait(false);
}
/// <inheritdoc/>
public IArchive OpenArchive(
IReadOnlyList<FileInfo> fileInfos,
ReaderOptions? readerOptions = null
) => SevenZipArchive.OpenArchive(fileInfos, readerOptions);
/// <inheritdoc/>
public async ValueTask<IAsyncArchive> OpenAsyncArchive(
IReadOnlyList<FileInfo> fileInfos,
ReaderOptions? readerOptions = null,
CancellationToken cancellationToken = default
)
{
cancellationToken.ThrowIfCancellationRequested();
return await SevenZipArchive
.OpenAsyncArchive(fileInfos, readerOptions, cancellationToken)
.ConfigureAwait(false);
}
#endregion
#region reader
internal override bool TryOpenReader(
SharpCompressStream sharpCompressStream,
ReaderOptions options,
out IReader? reader
)
{
reader = null;
return false;
}
#endregion
#region IWriterFactory
/// <inheritdoc/>
public IWriter OpenWriter(Stream stream, IWriterOptions writerOptions)
{
SevenZipWriterOptions sevenZipOptions = writerOptions switch
{
SevenZipWriterOptions szo => szo,
WriterOptions wo => new SevenZipWriterOptions(wo),
_ => throw new ArgumentException(
$"Expected WriterOptions or SevenZipWriterOptions, got {writerOptions.GetType().Name}",
nameof(writerOptions)
),
};
return new SevenZipWriter(stream, sevenZipOptions);
}
/// <inheritdoc/>
public ValueTask<IAsyncWriter> OpenAsyncWriter(
Stream stream,
IWriterOptions writerOptions,
CancellationToken cancellationToken = default
)
{
cancellationToken.ThrowIfCancellationRequested();
var writer = OpenWriter(stream, writerOptions);
return new((IAsyncWriter)writer);
}
#endregion
}