From 51c42b89b4617b0ed6344ba2ab447da0fa456e6a Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 12 Feb 2026 10:26:18 +0000 Subject: [PATCH] OpenAsyncArchive has to be async --- .../Archives/ArchiveFactory.Async.cs | 8 +++++-- src/SharpCompress/Archives/IArchiveFactory.cs | 13 +++++++++-- src/SharpCompress/Factories/GZipFactory.cs | 22 +++++++++++++++---- src/SharpCompress/Factories/RarFactory.cs | 22 +++++++++++++++---- .../Factories/SevenZipFactory.cs | 22 +++++++++++++++---- src/SharpCompress/Factories/TarFactory.cs | 14 ++++++++---- src/SharpCompress/Factories/ZipFactory.cs | 22 +++++++++++++++---- tests/SharpCompress.Test/ArchiveTests.cs | 2 +- 8 files changed, 100 insertions(+), 25 deletions(-) diff --git a/src/SharpCompress/Archives/ArchiveFactory.Async.cs b/src/SharpCompress/Archives/ArchiveFactory.Async.cs index 8c6d9e34..4af94a57 100644 --- a/src/SharpCompress/Archives/ArchiveFactory.Async.cs +++ b/src/SharpCompress/Archives/ArchiveFactory.Async.cs @@ -22,7 +22,9 @@ public static partial class ArchiveFactory readerOptions ??= ReaderOptions.ForExternalStream; var factory = await FindFactoryAsync(stream, cancellationToken) .ConfigureAwait(false); - return factory.OpenAsyncArchive(stream, readerOptions); + return await factory + .OpenAsyncArchive(stream, readerOptions, cancellationToken) + .ConfigureAwait(false); } public static ValueTask OpenAsyncArchive( @@ -45,7 +47,9 @@ public static partial class ArchiveFactory var factory = await FindFactoryAsync(fileInfo, cancellationToken) .ConfigureAwait(false); - return factory.OpenAsyncArchive(fileInfo, options); + return await factory + .OpenAsyncArchive(fileInfo, options, cancellationToken) + .ConfigureAwait(false); } public static async ValueTask OpenAsyncArchive( diff --git a/src/SharpCompress/Archives/IArchiveFactory.cs b/src/SharpCompress/Archives/IArchiveFactory.cs index 12777a45..52320450 100644 --- a/src/SharpCompress/Archives/IArchiveFactory.cs +++ b/src/SharpCompress/Archives/IArchiveFactory.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading; +using System.Threading.Tasks; using SharpCompress.Factories; using SharpCompress.Readers; @@ -32,7 +33,11 @@ public interface IArchiveFactory : IFactory /// /// An open, readable and seekable stream. /// reading options. - IAsyncArchive OpenAsyncArchive(Stream stream, ReaderOptions? readerOptions = null); + ValueTask OpenAsyncArchive( + Stream stream, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ); /// /// Constructor with a FileInfo object to an existing file. @@ -47,5 +52,9 @@ public interface IArchiveFactory : IFactory /// the file to open. /// reading options. /// Cancellation token. - IAsyncArchive OpenAsyncArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null); + ValueTask OpenAsyncArchive( + FileInfo fileInfo, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ); } diff --git a/src/SharpCompress/Factories/GZipFactory.cs b/src/SharpCompress/Factories/GZipFactory.cs index 6d38d418..ab40438c 100644 --- a/src/SharpCompress/Factories/GZipFactory.cs +++ b/src/SharpCompress/Factories/GZipFactory.cs @@ -63,12 +63,26 @@ public class GZipFactory GZipArchive.OpenArchive(stream, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(Stream stream, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(stream, readerOptions); + public ValueTask OpenAsyncArchive( + Stream stream, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(stream, readerOptions)); + } /// - public IAsyncArchive OpenAsyncArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(fileInfo, readerOptions); + public ValueTask OpenAsyncArchive( + FileInfo fileInfo, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(fileInfo, readerOptions)); + } #endregion diff --git a/src/SharpCompress/Factories/RarFactory.cs b/src/SharpCompress/Factories/RarFactory.cs index f3236d2e..c81e54a7 100644 --- a/src/SharpCompress/Factories/RarFactory.cs +++ b/src/SharpCompress/Factories/RarFactory.cs @@ -54,16 +54,30 @@ public class RarFactory : Factory, IArchiveFactory, IMultiArchiveFactory, IReade RarArchive.OpenArchive(stream, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(Stream stream, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(stream, readerOptions); + public ValueTask OpenAsyncArchive( + Stream stream, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(stream, readerOptions)); + } /// public IArchive OpenArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => RarArchive.OpenArchive(fileInfo, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(fileInfo, readerOptions); + public ValueTask OpenAsyncArchive( + FileInfo fileInfo, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(fileInfo, readerOptions)); + } #endregion diff --git a/src/SharpCompress/Factories/SevenZipFactory.cs b/src/SharpCompress/Factories/SevenZipFactory.cs index a75b8448..93826468 100644 --- a/src/SharpCompress/Factories/SevenZipFactory.cs +++ b/src/SharpCompress/Factories/SevenZipFactory.cs @@ -49,16 +49,30 @@ public class SevenZipFactory : Factory, IArchiveFactory, IMultiArchiveFactory SevenZipArchive.OpenArchive(stream, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(Stream stream, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(stream, readerOptions); + public ValueTask OpenAsyncArchive( + Stream stream, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(stream, readerOptions)); + } /// public IArchive OpenArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => SevenZipArchive.OpenArchive(fileInfo, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(fileInfo, readerOptions); + public ValueTask OpenAsyncArchive( + FileInfo fileInfo, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(fileInfo, readerOptions)); + } #endregion diff --git a/src/SharpCompress/Factories/TarFactory.cs b/src/SharpCompress/Factories/TarFactory.cs index f47e6de8..88d6afa3 100644 --- a/src/SharpCompress/Factories/TarFactory.cs +++ b/src/SharpCompress/Factories/TarFactory.cs @@ -157,16 +157,22 @@ public class TarFactory TarArchive.OpenArchive(stream, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(Stream stream, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(stream, readerOptions); + public async ValueTask OpenAsyncArchive( + Stream stream, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) => await TarArchive.OpenAsyncArchive(stream, readerOptions, cancellationToken); /// public IArchive OpenArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => TarArchive.OpenArchive(fileInfo, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(fileInfo, readerOptions); + public async ValueTask OpenAsyncArchive( + FileInfo fileInfo, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) => await TarArchive.OpenAsyncArchive(fileInfo, readerOptions, cancellationToken); #endregion diff --git a/src/SharpCompress/Factories/ZipFactory.cs b/src/SharpCompress/Factories/ZipFactory.cs index 6b7df689..6c683a38 100644 --- a/src/SharpCompress/Factories/ZipFactory.cs +++ b/src/SharpCompress/Factories/ZipFactory.cs @@ -127,16 +127,30 @@ public class ZipFactory ZipArchive.OpenArchive(stream, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(Stream stream, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(stream, readerOptions); + public ValueTask OpenAsyncArchive( + Stream stream, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(stream, readerOptions)); + } /// public IArchive OpenArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => ZipArchive.OpenArchive(fileInfo, readerOptions); /// - public IAsyncArchive OpenAsyncArchive(FileInfo fileInfo, ReaderOptions? readerOptions = null) => - (IAsyncArchive)OpenArchive(fileInfo, readerOptions); + public ValueTask OpenAsyncArchive( + FileInfo fileInfo, + ReaderOptions? readerOptions = null, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return new((IAsyncArchive)OpenArchive(fileInfo, readerOptions)); + } #endregion diff --git a/tests/SharpCompress.Test/ArchiveTests.cs b/tests/SharpCompress.Test/ArchiveTests.cs index 95e10214..0d98e805 100644 --- a/tests/SharpCompress.Test/ArchiveTests.cs +++ b/tests/SharpCompress.Test/ArchiveTests.cs @@ -614,7 +614,7 @@ public class ArchiveTests : ReaderTests { using (var stream = SharpCompressStream.CreateNonDisposing(File.OpenRead(path))) await using ( - var archive = archiveFactory.OpenAsyncArchive( + var archive = await archiveFactory.OpenAsyncArchive( new AsyncOnlyStream(stream), readerOptions )