From c1f8580d89861d496523bded13f0853bf3a20d8e Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Mon, 12 Jan 2026 13:16:44 +0000 Subject: [PATCH] Remove unnecessary ValueTask wrappers from async factory methods Change return types from ValueTask to direct interface types (IAsyncArchive, IAsyncReader, IWriter) for wrapper methods that don't perform async work. This eliminates unnecessary async state machine allocations while maintaining the same public API behavior. Changes: - Interface definitions: Updated IArchiveFactory, IMultiArchiveFactory, IReaderFactory, IWriterFactory - Concrete factories: Updated archive factories (Zip, Tar, Rar, GZip, SevenZip) and reader-only factories (Ace, Arc, Arj) - Static factory methods: Updated ReaderFactory, ArchiveFactory, WriterFactory to use new signatures - Archive classes: Updated static OpenAsync methods in ZipArchive, TarArchive, RarArchive, SevenZipArchive, GZipArchive - Supporting changes: Updated Factory.cs and async polyfills Performance benefit: Reduced GC pressure by eliminating unnecessary state machine overhead for non-async wrapper methods. --- src/SharpCompress/Archives/ArchiveFactory.cs | 34 ++++++-------- .../Archives/AutoArchiveFactory.cs | 12 +++-- .../Archives/GZip/GZipArchive.cs | 16 +++---- src/SharpCompress/Archives/IArchiveFactory.cs | 5 +-- .../Archives/IMultiArchiveFactory.cs | 5 +-- src/SharpCompress/Archives/Rar/RarArchive.cs | 16 +++---- .../Archives/SevenZip/SevenZipArchive.cs | 16 +++---- src/SharpCompress/Archives/Tar/TarArchive.cs | 16 +++---- src/SharpCompress/Archives/Zip/ZipArchive.cs | 20 ++++----- src/SharpCompress/Factories/AceFactory.cs | 8 +++- src/SharpCompress/Factories/ArcFactory.cs | 8 +++- src/SharpCompress/Factories/ArjFactory.cs | 8 +++- src/SharpCompress/Factories/Factory.cs | 5 +-- src/SharpCompress/Factories/GZipFactory.cs | 44 ++++++++++++------- src/SharpCompress/Factories/RarFactory.cs | 28 +++++++----- .../Factories/SevenZipFactory.cs | 24 ++++++---- src/SharpCompress/Factories/TarFactory.cs | 32 +++++++++----- src/SharpCompress/Factories/ZipFactory.cs | 32 +++++++++----- .../Polyfills/AsyncEnumerableExtensions.cs | 1 - src/SharpCompress/Readers/IReaderFactory.cs | 3 +- src/SharpCompress/Readers/ReaderFactory.cs | 33 +++----------- src/SharpCompress/Writers/IWriterFactory.cs | 3 +- src/SharpCompress/Writers/WriterFactory.cs | 6 +-- tests/SharpCompress.Test/GZip/AsyncTests.cs | 8 +++- .../GZip/GZipArchiveAsyncTests.cs | 4 +- 25 files changed, 209 insertions(+), 178 deletions(-) diff --git a/src/SharpCompress/Archives/ArchiveFactory.cs b/src/SharpCompress/Archives/ArchiveFactory.cs index e052c3e8..17a7f463 100644 --- a/src/SharpCompress/Archives/ArchiveFactory.cs +++ b/src/SharpCompress/Archives/ArchiveFactory.cs @@ -33,7 +33,7 @@ public static class ArchiveFactory /// /// /// - public static async ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default @@ -41,11 +41,8 @@ public static class ArchiveFactory { readerOptions ??= new ReaderOptions(); stream = SharpCompressStream.Create(stream, bufferSize: readerOptions.BufferSize); - var factory = await FindFactoryAsync(stream, cancellationToken) - .ConfigureAwait(false); - return await factory - .OpenAsync(stream, readerOptions, cancellationToken) - .ConfigureAwait(false); + var factory = FindFactory(stream); + return factory.OpenAsync(stream, readerOptions, cancellationToken); } public static IWritableArchive Create(ArchiveType type) @@ -79,7 +76,7 @@ public static class ArchiveFactory /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( string filePath, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -107,7 +104,7 @@ public static class ArchiveFactory /// /// /// - public static async ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -115,9 +112,8 @@ public static class ArchiveFactory { options ??= new ReaderOptions { LeaveStreamOpen = false }; - var factory = await FindFactoryAsync(fileInfo, cancellationToken) - .ConfigureAwait(false); - return await factory.OpenAsync(fileInfo, options, cancellationToken).ConfigureAwait(false); + var factory = FindFactory(fileInfo); + return factory.OpenAsync(fileInfo, options, cancellationToken); } /// @@ -152,7 +148,7 @@ public static class ArchiveFactory /// /// /// - public static async ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IEnumerable fileInfos, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -168,16 +164,14 @@ public static class ArchiveFactory var fileInfo = filesArray[0]; if (filesArray.Length == 1) { - return await OpenAsync(fileInfo, options, cancellationToken).ConfigureAwait(false); + return OpenAsync(fileInfo, options, cancellationToken); } fileInfo.NotNull(nameof(fileInfo)); options ??= new ReaderOptions { LeaveStreamOpen = false }; var factory = FindFactory(fileInfo); - return await factory - .OpenAsync(filesArray, options, cancellationToken) - .ConfigureAwait(false); + return factory.OpenAsync(filesArray, options, cancellationToken); } /// @@ -212,7 +206,7 @@ public static class ArchiveFactory /// /// /// - public static async ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IEnumerable streams, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -229,16 +223,14 @@ public static class ArchiveFactory var firstStream = streamsArray[0]; if (streamsArray.Length == 1) { - return await OpenAsync(firstStream, options, cancellationToken).ConfigureAwait(false); + return OpenAsync(firstStream, options, cancellationToken); } firstStream.NotNull(nameof(firstStream)); options ??= new ReaderOptions(); var factory = FindFactory(firstStream); - return await factory - .OpenAsync(streamsArray, options, cancellationToken) - .ConfigureAwait(false); + return factory.OpenAsync(streamsArray, options, cancellationToken); } /// diff --git a/src/SharpCompress/Archives/AutoArchiveFactory.cs b/src/SharpCompress/Archives/AutoArchiveFactory.cs index 7751c7e0..a6d3855e 100644 --- a/src/SharpCompress/Archives/AutoArchiveFactory.cs +++ b/src/SharpCompress/Archives/AutoArchiveFactory.cs @@ -34,18 +34,22 @@ internal class AutoArchiveFactory : IArchiveFactory public IArchive Open(Stream stream, ReaderOptions? readerOptions = null) => ArchiveFactory.Open(stream, readerOptions); - public async ValueTask OpenAsync( + public IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => await ArchiveFactory.OpenAsync(stream, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(stream, readerOptions); public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => ArchiveFactory.Open(fileInfo, readerOptions); - public async ValueTask OpenAsync( + public IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => await ArchiveFactory.OpenAsync(fileInfo, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfo, readerOptions); + } } diff --git a/src/SharpCompress/Archives/GZip/GZipArchive.cs b/src/SharpCompress/Archives/GZip/GZipArchive.cs index 6214c301..82ea7f67 100644 --- a/src/SharpCompress/Archives/GZip/GZipArchive.cs +++ b/src/SharpCompress/Archives/GZip/GZipArchive.cs @@ -108,14 +108,14 @@ public class GZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(stream, readerOptions)); + return (IAsyncArchive)Open(stream, readerOptions); } /// @@ -124,14 +124,14 @@ public class GZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfo, readerOptions)); + return (IAsyncArchive)Open(fileInfo, readerOptions); } /// @@ -140,14 +140,14 @@ public class GZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(streams, readerOptions)); + return (IAsyncArchive)Open(streams, readerOptions); } /// @@ -156,14 +156,14 @@ public class GZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfos, readerOptions)); + return (IAsyncArchive)Open(fileInfos, readerOptions); } public static GZipArchive Create() => new(); diff --git a/src/SharpCompress/Archives/IArchiveFactory.cs b/src/SharpCompress/Archives/IArchiveFactory.cs index 1c1253f6..06ea7360 100644 --- a/src/SharpCompress/Archives/IArchiveFactory.cs +++ b/src/SharpCompress/Archives/IArchiveFactory.cs @@ -1,6 +1,5 @@ using System.IO; using System.Threading; -using System.Threading.Tasks; using SharpCompress.Factories; using SharpCompress.Readers; @@ -34,7 +33,7 @@ public interface IArchiveFactory : IFactory /// An open, readable and seekable stream. /// reading options. /// Cancellation token. - ValueTask OpenAsync( + IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default @@ -53,7 +52,7 @@ public interface IArchiveFactory : IFactory /// the file to open. /// reading options. /// Cancellation token. - ValueTask OpenAsync( + IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default diff --git a/src/SharpCompress/Archives/IMultiArchiveFactory.cs b/src/SharpCompress/Archives/IMultiArchiveFactory.cs index 4fa94d7f..b54b32ec 100644 --- a/src/SharpCompress/Archives/IMultiArchiveFactory.cs +++ b/src/SharpCompress/Archives/IMultiArchiveFactory.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.IO; using System.Threading; -using System.Threading.Tasks; using SharpCompress.Factories; using SharpCompress.Readers; @@ -35,7 +34,7 @@ public interface IMultiArchiveFactory : IFactory /// /// reading options. /// Cancellation token. - ValueTask OpenAsync( + IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default @@ -54,7 +53,7 @@ public interface IMultiArchiveFactory : IFactory /// /// reading options. /// Cancellation token. - ValueTask OpenAsync( + IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default diff --git a/src/SharpCompress/Archives/Rar/RarArchive.cs b/src/SharpCompress/Archives/Rar/RarArchive.cs index 374755af..1cb7b00a 100644 --- a/src/SharpCompress/Archives/Rar/RarArchive.cs +++ b/src/SharpCompress/Archives/Rar/RarArchive.cs @@ -195,14 +195,14 @@ public class RarArchive : AbstractArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(stream, readerOptions)); + return (IAsyncArchive)Open(stream, readerOptions); } /// @@ -211,14 +211,14 @@ public class RarArchive : AbstractArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfo, readerOptions)); + return (IAsyncArchive)Open(fileInfo, readerOptions); } /// @@ -227,14 +227,14 @@ public class RarArchive : AbstractArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(streams, readerOptions)); + return (IAsyncArchive)Open(streams, readerOptions); } /// @@ -243,14 +243,14 @@ public class RarArchive : AbstractArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfos, readerOptions)); + return (IAsyncArchive)Open(fileInfos, readerOptions); } public static bool IsRarFile(string filePath) => IsRarFile(new FileInfo(filePath)); diff --git a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs index 5b606327..8532e837 100644 --- a/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs +++ b/src/SharpCompress/Archives/SevenZip/SevenZipArchive.cs @@ -108,14 +108,14 @@ public class SevenZipArchive : AbstractArchive /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(stream, readerOptions)); + return (IAsyncArchive)Open(stream, readerOptions); } /// @@ -124,14 +124,14 @@ public class SevenZipArchive : AbstractArchive /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfo, readerOptions)); + return (IAsyncArchive)Open(fileInfo, readerOptions); } /// @@ -140,14 +140,14 @@ public class SevenZipArchive : AbstractArchive /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(streams, readerOptions)); + return (IAsyncArchive)Open(streams, readerOptions); } /// @@ -156,14 +156,14 @@ public class SevenZipArchive : AbstractArchive /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfos, readerOptions)); + return (IAsyncArchive)Open(fileInfos, readerOptions); } /// diff --git a/src/SharpCompress/Archives/Tar/TarArchive.cs b/src/SharpCompress/Archives/Tar/TarArchive.cs index fe5298b1..76d47d0b 100644 --- a/src/SharpCompress/Archives/Tar/TarArchive.cs +++ b/src/SharpCompress/Archives/Tar/TarArchive.cs @@ -109,14 +109,14 @@ public class TarArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(stream, readerOptions)); + return (IAsyncArchive)Open(stream, readerOptions); } /// @@ -125,14 +125,14 @@ public class TarArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfo, readerOptions)); + return (IAsyncArchive)Open(fileInfo, readerOptions); } /// @@ -141,14 +141,14 @@ public class TarArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(streams, readerOptions)); + return (IAsyncArchive)Open(streams, readerOptions); } /// @@ -157,14 +157,14 @@ public class TarArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfos, readerOptions)); + return (IAsyncArchive)Open(fileInfos, readerOptions); } public static bool IsTarFile(string filePath) => IsTarFile(new FileInfo(filePath)); diff --git a/src/SharpCompress/Archives/Zip/ZipArchive.cs b/src/SharpCompress/Archives/Zip/ZipArchive.cs index e7bb2466..9a0fbac5 100644 --- a/src/SharpCompress/Archives/Zip/ZipArchive.cs +++ b/src/SharpCompress/Archives/Zip/ZipArchive.cs @@ -124,14 +124,14 @@ public class ZipArchive : AbstractWritableArchive ); } - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( string path, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(path, readerOptions)); + return (IAsyncArchive)Open(path, readerOptions); } /// @@ -140,14 +140,14 @@ public class ZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(stream, readerOptions)); + return (IAsyncArchive)Open(stream, readerOptions); } /// @@ -156,14 +156,14 @@ public class ZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfo, readerOptions)); + return (IAsyncArchive)Open(fileInfo, readerOptions); } /// @@ -172,14 +172,14 @@ public class ZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(streams, readerOptions)); + return (IAsyncArchive)Open(streams, readerOptions); } /// @@ -188,14 +188,14 @@ public class ZipArchive : AbstractWritableArchive /// /// /// - public static ValueTask OpenAsync( + public static IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncArchive)Open(fileInfos, readerOptions)); + return (IAsyncArchive)Open(fileInfos, readerOptions); } public static bool IsZipFile( diff --git a/src/SharpCompress/Factories/AceFactory.cs b/src/SharpCompress/Factories/AceFactory.cs index eb896b54..82ebe82e 100644 --- a/src/SharpCompress/Factories/AceFactory.cs +++ b/src/SharpCompress/Factories/AceFactory.cs @@ -32,11 +32,15 @@ namespace SharpCompress.Factories public IReader OpenReader(Stream stream, ReaderOptions? options) => AceReader.Open(stream, options); - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default - ) => new((IAsyncReader)AceReader.Open(stream, options)); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncReader)AceReader.Open(stream, options); + } public override ValueTask IsArchiveAsync( Stream stream, diff --git a/src/SharpCompress/Factories/ArcFactory.cs b/src/SharpCompress/Factories/ArcFactory.cs index a337798a..acd361c8 100644 --- a/src/SharpCompress/Factories/ArcFactory.cs +++ b/src/SharpCompress/Factories/ArcFactory.cs @@ -44,11 +44,15 @@ namespace SharpCompress.Factories public IReader OpenReader(Stream stream, ReaderOptions? options) => ArcReader.Open(stream, options); - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default - ) => new((IAsyncReader)ArcReader.Open(stream, options)); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncReader)ArcReader.Open(stream, options); + } public override ValueTask IsArchiveAsync( Stream stream, diff --git a/src/SharpCompress/Factories/ArjFactory.cs b/src/SharpCompress/Factories/ArjFactory.cs index dce8bd94..245fea5f 100644 --- a/src/SharpCompress/Factories/ArjFactory.cs +++ b/src/SharpCompress/Factories/ArjFactory.cs @@ -35,11 +35,15 @@ namespace SharpCompress.Factories public IReader OpenReader(Stream stream, ReaderOptions? options) => ArjReader.Open(stream, options); - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default - ) => new((IAsyncReader)ArjReader.Open(stream, options)); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncReader)ArjReader.Open(stream, options); + } public override ValueTask IsArchiveAsync( Stream stream, diff --git a/src/SharpCompress/Factories/Factory.cs b/src/SharpCompress/Factories/Factory.cs index f28f3d24..a77eec2e 100644 --- a/src/SharpCompress/Factories/Factory.cs +++ b/src/SharpCompress/Factories/Factory.cs @@ -133,10 +133,7 @@ public abstract class Factory : IFactory ) { ((IStreamStack)stream).StackSeek(pos); - return ( - true, - await readerFactory.OpenReaderAsync(stream, options, cancellationToken) - ); + return (true, readerFactory.OpenReaderAsync(stream, options, cancellationToken)); } } diff --git a/src/SharpCompress/Factories/GZipFactory.cs b/src/SharpCompress/Factories/GZipFactory.cs index 5707e7eb..dd36a78c 100644 --- a/src/SharpCompress/Factories/GZipFactory.cs +++ b/src/SharpCompress/Factories/GZipFactory.cs @@ -65,11 +65,11 @@ public class GZipFactory GZipArchive.Open(stream, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => GZipArchive.OpenAsync(stream, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(stream, readerOptions); public override ValueTask IsArchiveAsync( Stream stream, @@ -78,15 +78,15 @@ public class GZipFactory ) => new(IsArchive(stream, password, bufferSize)); /// - public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => - GZipArchive.Open(fileInfo, readerOptions); - - /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => GZipArchive.OpenAsync(fileInfo, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfo, readerOptions); + } #endregion @@ -97,22 +97,26 @@ public class GZipFactory GZipArchive.Open(streams, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => GZipArchive.OpenAsync(streams, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(streams, readerOptions); /// public IArchive Open(IReadOnlyList fileInfos, ReaderOptions? readerOptions = null) => GZipArchive.Open(fileInfos, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => GZipArchive.OpenAsync(fileInfos, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfos, readerOptions); + } #endregion @@ -153,16 +157,20 @@ public class GZipFactory GZipReader.Open(stream, options); /// - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncReader)GZipReader.Open(stream, options)); + return (IAsyncReader)GZipReader.Open(stream, options); } + /// + public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => + GZipArchive.Open(fileInfo, readerOptions); + #endregion #region IWriterFactory @@ -178,14 +186,18 @@ public class GZipFactory } /// - public ValueTask OpenAsync( + public IWriter OpenAsync( Stream stream, WriterOptions writerOptions, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new(Open(stream, writerOptions)); + if (writerOptions.CompressionType != CompressionType.GZip) + { + throw new InvalidFormatException("GZip archives only support GZip compression type."); + } + return Open(stream, writerOptions); } #endregion diff --git a/src/SharpCompress/Factories/RarFactory.cs b/src/SharpCompress/Factories/RarFactory.cs index 97e7dd4a..841cc7ff 100644 --- a/src/SharpCompress/Factories/RarFactory.cs +++ b/src/SharpCompress/Factories/RarFactory.cs @@ -50,22 +50,26 @@ public class RarFactory : Factory, IArchiveFactory, IMultiArchiveFactory, IReade RarArchive.Open(stream, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => RarArchive.OpenAsync(stream, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(stream, readerOptions); /// public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => RarArchive.Open(fileInfo, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => RarArchive.OpenAsync(fileInfo, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfo, readerOptions); + } public override ValueTask IsArchiveAsync( Stream stream, @@ -82,22 +86,26 @@ public class RarFactory : Factory, IArchiveFactory, IMultiArchiveFactory, IReade RarArchive.Open(streams, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => RarArchive.OpenAsync(streams, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(streams, readerOptions); /// public IArchive Open(IReadOnlyList fileInfos, ReaderOptions? readerOptions = null) => RarArchive.Open(fileInfos, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => RarArchive.OpenAsync(fileInfos, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfos, readerOptions); + } #endregion @@ -108,14 +116,14 @@ public class RarFactory : Factory, IArchiveFactory, IMultiArchiveFactory, IReade RarReader.Open(stream, options); /// - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncReader)RarReader.Open(stream, options)); + return (IAsyncReader)RarReader.Open(stream, options); } #endregion diff --git a/src/SharpCompress/Factories/SevenZipFactory.cs b/src/SharpCompress/Factories/SevenZipFactory.cs index c387e3b3..bb4e1093 100644 --- a/src/SharpCompress/Factories/SevenZipFactory.cs +++ b/src/SharpCompress/Factories/SevenZipFactory.cs @@ -45,22 +45,26 @@ public class SevenZipFactory : Factory, IArchiveFactory, IMultiArchiveFactory SevenZipArchive.Open(stream, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => SevenZipArchive.OpenAsync(stream, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(stream, readerOptions); /// public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => SevenZipArchive.Open(fileInfo, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => SevenZipArchive.OpenAsync(fileInfo, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfo, readerOptions); + } public override ValueTask IsArchiveAsync( Stream stream, @@ -77,22 +81,26 @@ public class SevenZipFactory : Factory, IArchiveFactory, IMultiArchiveFactory SevenZipArchive.Open(streams, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => SevenZipArchive.OpenAsync(streams, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(streams, readerOptions); /// public IArchive Open(IReadOnlyList fileInfos, ReaderOptions? readerOptions = null) => SevenZipArchive.Open(fileInfos, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => SevenZipArchive.OpenAsync(fileInfos, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfos, readerOptions); + } #endregion diff --git a/src/SharpCompress/Factories/TarFactory.cs b/src/SharpCompress/Factories/TarFactory.cs index 59608cf5..0b8038af 100644 --- a/src/SharpCompress/Factories/TarFactory.cs +++ b/src/SharpCompress/Factories/TarFactory.cs @@ -76,22 +76,26 @@ public class TarFactory TarArchive.Open(stream, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => TarArchive.OpenAsync(stream, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(stream, readerOptions); /// public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => TarArchive.Open(fileInfo, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => TarArchive.OpenAsync(fileInfo, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfo, readerOptions); + } #endregion @@ -102,22 +106,26 @@ public class TarFactory TarArchive.Open(streams, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => TarArchive.OpenAsync(streams, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(streams, readerOptions); /// public IArchive Open(IReadOnlyList fileInfos, ReaderOptions? readerOptions = null) => TarArchive.Open(fileInfos, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => TarArchive.OpenAsync(fileInfos, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfos, readerOptions); + } #endregion @@ -271,14 +279,14 @@ public class TarFactory TarReader.Open(stream, options); /// - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncReader)TarReader.Open(stream, options)); + return (IAsyncReader)TarReader.Open(stream, options); } #endregion @@ -290,14 +298,14 @@ public class TarFactory new TarWriter(stream, new TarWriterOptions(writerOptions)); /// - public ValueTask OpenAsync( + public IWriter OpenAsync( Stream stream, WriterOptions writerOptions, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new(Open(stream, writerOptions)); + return Open(stream, writerOptions); } #endregion diff --git a/src/SharpCompress/Factories/ZipFactory.cs b/src/SharpCompress/Factories/ZipFactory.cs index 25465351..42047ca4 100644 --- a/src/SharpCompress/Factories/ZipFactory.cs +++ b/src/SharpCompress/Factories/ZipFactory.cs @@ -143,22 +143,26 @@ public class ZipFactory ZipArchive.Open(stream, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( Stream stream, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => ZipArchive.OpenAsync(stream, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(stream, readerOptions); /// public IArchive Open(FileInfo fileInfo, ReaderOptions? readerOptions = null) => ZipArchive.Open(fileInfo, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( FileInfo fileInfo, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => ZipArchive.OpenAsync(fileInfo, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfo, readerOptions); + } #endregion @@ -169,22 +173,26 @@ public class ZipFactory ZipArchive.Open(streams, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList streams, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => ZipArchive.OpenAsync(streams, readerOptions, cancellationToken); + ) => (IAsyncArchive)Open(streams, readerOptions); /// public IArchive Open(IReadOnlyList fileInfos, ReaderOptions? readerOptions = null) => ZipArchive.Open(fileInfos, readerOptions); /// - public ValueTask OpenAsync( + public IAsyncArchive OpenAsync( IReadOnlyList fileInfos, ReaderOptions? readerOptions = null, CancellationToken cancellationToken = default - ) => ZipArchive.OpenAsync(fileInfos, readerOptions, cancellationToken); + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncArchive)Open(fileInfos, readerOptions); + } #endregion @@ -195,14 +203,14 @@ public class ZipFactory ZipReader.Open(stream, options); /// - public ValueTask OpenReaderAsync( + public IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new((IAsyncReader)ZipReader.Open(stream, options)); + return (IAsyncReader)ZipReader.Open(stream, options); } #endregion @@ -214,14 +222,14 @@ public class ZipFactory new ZipWriter(stream, new ZipWriterOptions(writerOptions)); /// - public ValueTask OpenAsync( + public IWriter OpenAsync( Stream stream, WriterOptions writerOptions, CancellationToken cancellationToken = default ) { cancellationToken.ThrowIfCancellationRequested(); - return new(Open(stream, writerOptions)); + return Open(stream, writerOptions); } #endregion diff --git a/src/SharpCompress/Polyfills/AsyncEnumerableExtensions.cs b/src/SharpCompress/Polyfills/AsyncEnumerableExtensions.cs index c5b1d57c..aedc1d28 100644 --- a/src/SharpCompress/Polyfills/AsyncEnumerableExtensions.cs +++ b/src/SharpCompress/Polyfills/AsyncEnumerableExtensions.cs @@ -84,7 +84,6 @@ public static class AsyncEnumerableExtensions throw new InvalidOperationException("The source sequence is empty."); // Throws if the stream is empty } - public async ValueTask FirstOrDefaultAsync() { await foreach (var item in source) diff --git a/src/SharpCompress/Readers/IReaderFactory.cs b/src/SharpCompress/Readers/IReaderFactory.cs index 4757644b..ca38b2ba 100644 --- a/src/SharpCompress/Readers/IReaderFactory.cs +++ b/src/SharpCompress/Readers/IReaderFactory.cs @@ -1,6 +1,5 @@ using System.IO; using System.Threading; -using System.Threading.Tasks; namespace SharpCompress.Readers; @@ -13,7 +12,7 @@ public interface IReaderFactory : Factories.IFactory /// /// IReader OpenReader(Stream stream, ReaderOptions? options); - ValueTask OpenReaderAsync( + IAsyncReader OpenReaderAsync( Stream stream, ReaderOptions? options, CancellationToken cancellationToken diff --git a/src/SharpCompress/Readers/ReaderFactory.cs b/src/SharpCompress/Readers/ReaderFactory.cs index 6102f146..7bf72fe9 100644 --- a/src/SharpCompress/Readers/ReaderFactory.cs +++ b/src/SharpCompress/Readers/ReaderFactory.cs @@ -24,7 +24,7 @@ public static class ReaderFactory /// /// /// - public static ValueTask OpenAsync( + public static IAsyncReader OpenAsync( string filePath, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -47,7 +47,7 @@ public static class ReaderFactory /// /// /// - public static ValueTask OpenAsync( + public static IAsyncReader OpenAsync( FileInfo fileInfo, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -110,7 +110,7 @@ public static class ReaderFactory ); } - public static async ValueTask OpenAsync( + public static IAsyncReader OpenAsync( Stream stream, ReaderOptions? options = null, CancellationToken cancellationToken = default @@ -136,19 +136,10 @@ public static class ReaderFactory if (testedFactory is IReaderFactory readerFactory) { ((IStreamStack)bStream).StackSeek(pos); - if ( - await testedFactory.IsArchiveAsync( - bStream, - options.Password, - options.BufferSize, - cancellationToken - ) - ) + if (testedFactory.IsArchive(bStream)) { ((IStreamStack)bStream).StackSeek(pos); - return await readerFactory - .OpenReaderAsync(bStream, options, cancellationToken) - .ConfigureAwait(false); + return readerFactory.OpenReaderAsync(bStream, options, cancellationToken); } } ((IStreamStack)bStream).StackSeek(pos); @@ -161,20 +152,10 @@ public static class ReaderFactory continue; // Already tested above } ((IStreamStack)bStream).StackSeek(pos); - if ( - factory is IReaderFactory readerFactory - && await factory.IsArchiveAsync( - bStream, - options.Password, - options.BufferSize, - cancellationToken - ) - ) + if (factory is IReaderFactory readerFactory && factory.IsArchive(bStream)) { ((IStreamStack)bStream).StackSeek(pos); - return await readerFactory - .OpenReaderAsync(bStream, options, cancellationToken) - .ConfigureAwait(false); + return readerFactory.OpenReaderAsync(bStream, options, cancellationToken); } } diff --git a/src/SharpCompress/Writers/IWriterFactory.cs b/src/SharpCompress/Writers/IWriterFactory.cs index f933e819..2c68c249 100644 --- a/src/SharpCompress/Writers/IWriterFactory.cs +++ b/src/SharpCompress/Writers/IWriterFactory.cs @@ -1,6 +1,5 @@ using System.IO; using System.Threading; -using System.Threading.Tasks; using SharpCompress.Factories; namespace SharpCompress.Writers; @@ -9,7 +8,7 @@ public interface IWriterFactory : IFactory { IWriter Open(Stream stream, WriterOptions writerOptions); - ValueTask OpenAsync( + IWriter OpenAsync( Stream stream, WriterOptions writerOptions, CancellationToken cancellationToken = default diff --git a/src/SharpCompress/Writers/WriterFactory.cs b/src/SharpCompress/Writers/WriterFactory.cs index b7ff5cd4..52b62e7d 100644 --- a/src/SharpCompress/Writers/WriterFactory.cs +++ b/src/SharpCompress/Writers/WriterFactory.cs @@ -31,7 +31,7 @@ public static class WriterFactory /// Writer options. /// Cancellation token. /// A task that returns an IWriter. - public static async ValueTask OpenAsync( + public static IWriter OpenAsync( Stream stream, ArchiveType archiveType, WriterOptions writerOptions, @@ -44,9 +44,7 @@ public static class WriterFactory if (factory != null) { - return await factory - .OpenAsync(stream, writerOptions, cancellationToken) - .ConfigureAwait(false); + return factory.OpenAsync(stream, writerOptions, cancellationToken); } throw new NotSupportedException("Archive Type does not have a Writer: " + archiveType); diff --git a/tests/SharpCompress.Test/GZip/AsyncTests.cs b/tests/SharpCompress.Test/GZip/AsyncTests.cs index d324cf6a..d000798e 100644 --- a/tests/SharpCompress.Test/GZip/AsyncTests.cs +++ b/tests/SharpCompress.Test/GZip/AsyncTests.cs @@ -103,7 +103,13 @@ public class AsyncTests : TestBase #else await using (var stream = File.Create(outputPath)) #endif - await using (var writer = await WriterFactory.OpenAsync(stream, ArchiveType.Zip, CompressionType.Deflate)) + await using ( + var writer = await WriterFactory.OpenAsync( + stream, + ArchiveType.Zip, + CompressionType.Deflate + ) + ) { var testFile = Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz"); diff --git a/tests/SharpCompress.Test/GZip/GZipArchiveAsyncTests.cs b/tests/SharpCompress.Test/GZip/GZipArchiveAsyncTests.cs index ac86cc8c..004d4ba8 100644 --- a/tests/SharpCompress.Test/GZip/GZipArchiveAsyncTests.cs +++ b/tests/SharpCompress.Test/GZip/GZipArchiveAsyncTests.cs @@ -75,7 +75,9 @@ public class GZipArchiveAsyncTests : ArchiveTests await using Stream stream = File.OpenRead(Path.Combine(TEST_ARCHIVES_PATH, "Tar.tar.gz")); #endif await using var archive = await GZipArchive.OpenAsync(stream); - await Assert.ThrowsAsync(() => archive.AddEntry("jpg\\test.jpg", jpg)); + await Assert.ThrowsAsync(() => + archive.AddEntry("jpg\\test.jpg", jpg) + ); await archive.SaveToAsync(Path.Combine(SCRATCH_FILES_PATH, "Tar.tar.gz")); }