mirror of
https://github.com/adamhathcock/sharpcompress.git
synced 2026-10-02 11:48:36 +00:00
170 lines
4.9 KiB
C#
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
|
|
}
|