From e63ee57ef0d386e5c4b9b36c032ef5a90e5539a1 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Wed, 14 Jan 2026 09:29:44 +0000 Subject: [PATCH] same for writers --- .../Writers/GZip/GZipWriter.Factory.cs | 58 +++++++++++++++++++ src/SharpCompress/Writers/GZip/GZipWriter.cs | 2 +- src/SharpCompress/Writers/IWriterOpenable.cs | 33 ++++++++++- .../Writers/Tar/TarWriter.Factory.cs | 58 +++++++++++++++++++ src/SharpCompress/Writers/Tar/TarWriter.cs | 2 +- src/SharpCompress/Writers/WriterFactory.cs | 1 - .../Writers/Zip/ZipWriter.Factory.cs | 58 +++++++++++++++++++ src/SharpCompress/Writers/Zip/ZipWriter.cs | 2 +- 8 files changed, 208 insertions(+), 6 deletions(-) create mode 100644 src/SharpCompress/Writers/GZip/GZipWriter.Factory.cs create mode 100644 src/SharpCompress/Writers/Tar/TarWriter.Factory.cs create mode 100644 src/SharpCompress/Writers/Zip/ZipWriter.Factory.cs diff --git a/src/SharpCompress/Writers/GZip/GZipWriter.Factory.cs b/src/SharpCompress/Writers/GZip/GZipWriter.Factory.cs new file mode 100644 index 00000000..57a22b54 --- /dev/null +++ b/src/SharpCompress/Writers/GZip/GZipWriter.Factory.cs @@ -0,0 +1,58 @@ +#if NET8_0_OR_GREATER +using System.IO; +using System.Threading; +using SharpCompress.Common; + +namespace SharpCompress.Writers.GZip; + +public partial class GZipWriter : IWriterOpenable +{ + public static IWriter Open(string filePath, GZipWriterOptions writerOptions) + { + filePath.NotNullOrEmpty(nameof(filePath)); + return Open(new FileInfo(filePath), writerOptions); + } + + public static IWriter Open(FileInfo fileInfo, GZipWriterOptions writerOptions) + { + fileInfo.NotNull(nameof(fileInfo)); + return new GZipWriter(fileInfo.OpenWrite(), writerOptions); + } + + public static IWriter Open(Stream stream, GZipWriterOptions writerOptions) + { + stream.NotNull(nameof(stream)); + return new GZipWriter(stream, writerOptions); + } + + public static IAsyncWriter OpenAsync( + string path, + GZipWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(path, writerOptions); + } + + public static IAsyncWriter OpenAsync( + Stream stream, + GZipWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(stream, writerOptions); + } + + public static IAsyncWriter OpenAsync( + FileInfo fileInfo, + GZipWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(fileInfo, writerOptions); + } +} +#endif diff --git a/src/SharpCompress/Writers/GZip/GZipWriter.cs b/src/SharpCompress/Writers/GZip/GZipWriter.cs index ad1d59d7..95ebd253 100644 --- a/src/SharpCompress/Writers/GZip/GZipWriter.cs +++ b/src/SharpCompress/Writers/GZip/GZipWriter.cs @@ -7,7 +7,7 @@ using SharpCompress.IO; namespace SharpCompress.Writers.GZip; -public sealed class GZipWriter : AbstractWriter +public sealed partial class GZipWriter : AbstractWriter { private bool _wroteToStream; diff --git a/src/SharpCompress/Writers/IWriterOpenable.cs b/src/SharpCompress/Writers/IWriterOpenable.cs index f7073d25..5935bbe9 100644 --- a/src/SharpCompress/Writers/IWriterOpenable.cs +++ b/src/SharpCompress/Writers/IWriterOpenable.cs @@ -1,6 +1,35 @@ +#if NET8_0_OR_GREATER +using System.IO; +using System.Threading; + namespace SharpCompress.Writers; -public class IWriterOpenable +public interface IWriterOpenable + where TWriterOptions : WriterOptions { - + public static abstract IWriter Open(string filePath, TWriterOptions writerOptions); + + public static abstract IWriter Open(FileInfo fileInfo, TWriterOptions writerOptions); + public static abstract IWriter Open(Stream stream, TWriterOptions writerOptions); + + /// + /// Opens a Writer asynchronously. + /// + /// The stream to write to. + /// The archive type. + /// Writer options. + /// Cancellation token. + /// A task that returns an IWriter. + public static abstract IAsyncWriter OpenAsync( + Stream stream, + TWriterOptions writerOptions, + CancellationToken cancellationToken = default + ); + + public static abstract IAsyncWriter OpenAsync(string filePath, TWriterOptions writerOptions, + CancellationToken cancellationToken = default); + + public static abstract IAsyncWriter OpenAsync(FileInfo fileInfo, TWriterOptions writerOptions, + CancellationToken cancellationToken = default); } +#endif diff --git a/src/SharpCompress/Writers/Tar/TarWriter.Factory.cs b/src/SharpCompress/Writers/Tar/TarWriter.Factory.cs new file mode 100644 index 00000000..059fd62e --- /dev/null +++ b/src/SharpCompress/Writers/Tar/TarWriter.Factory.cs @@ -0,0 +1,58 @@ +#if NET8_0_OR_GREATER +using System.IO; +using System.Threading; +using SharpCompress.Common; + +namespace SharpCompress.Writers.Tar; + +public partial class TarWriter : IWriterOpenable +{ + public static IWriter Open(string filePath, TarWriterOptions writerOptions) + { + filePath.NotNullOrEmpty(nameof(filePath)); + return Open(new FileInfo(filePath), writerOptions); + } + + public static IWriter Open(FileInfo fileInfo, TarWriterOptions writerOptions) + { + fileInfo.NotNull(nameof(fileInfo)); + return new TarWriter(fileInfo.OpenWrite(), writerOptions); + } + + public static IWriter Open(Stream stream, TarWriterOptions writerOptions) + { + stream.NotNull(nameof(stream)); + return new TarWriter(stream, writerOptions); + } + + public static IAsyncWriter OpenAsync( + string path, + TarWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(path, writerOptions); + } + + public static IAsyncWriter OpenAsync( + Stream stream, + TarWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(stream, writerOptions); + } + + public static IAsyncWriter OpenAsync( + FileInfo fileInfo, + TarWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(fileInfo, writerOptions); + } +} +#endif diff --git a/src/SharpCompress/Writers/Tar/TarWriter.cs b/src/SharpCompress/Writers/Tar/TarWriter.cs index aec01454..ac16e66f 100644 --- a/src/SharpCompress/Writers/Tar/TarWriter.cs +++ b/src/SharpCompress/Writers/Tar/TarWriter.cs @@ -12,7 +12,7 @@ using SharpCompress.IO; namespace SharpCompress.Writers.Tar; -public class TarWriter : AbstractWriter +public partial class TarWriter : AbstractWriter { private readonly bool finalizeArchiveOnClose; private TarHeaderWriteFormat headerFormat; diff --git a/src/SharpCompress/Writers/WriterFactory.cs b/src/SharpCompress/Writers/WriterFactory.cs index be2a7780..ebeda45f 100644 --- a/src/SharpCompress/Writers/WriterFactory.cs +++ b/src/SharpCompress/Writers/WriterFactory.cs @@ -2,7 +2,6 @@ using System; using System.IO; using System.Linq; using System.Threading; -using System.Threading.Tasks; using SharpCompress.Common; namespace SharpCompress.Writers; diff --git a/src/SharpCompress/Writers/Zip/ZipWriter.Factory.cs b/src/SharpCompress/Writers/Zip/ZipWriter.Factory.cs new file mode 100644 index 00000000..44825a72 --- /dev/null +++ b/src/SharpCompress/Writers/Zip/ZipWriter.Factory.cs @@ -0,0 +1,58 @@ +#if NET8_0_OR_GREATER +using System.IO; +using System.Threading; +using SharpCompress.Common; + +namespace SharpCompress.Writers.Zip; + +public partial class ZipWriter : IWriterOpenable +{ + public static IWriter Open(string filePath, ZipWriterOptions writerOptions) + { + filePath.NotNullOrEmpty(nameof(filePath)); + return Open(new FileInfo(filePath), writerOptions); + } + + public static IWriter Open(FileInfo fileInfo, ZipWriterOptions writerOptions) + { + fileInfo.NotNull(nameof(fileInfo)); + return new ZipWriter(fileInfo.OpenWrite(), writerOptions); + } + + public static IWriter Open(Stream stream, ZipWriterOptions writerOptions) + { + stream.NotNull(nameof(stream)); + return new ZipWriter(stream, writerOptions); + } + + public static IAsyncWriter OpenAsync( + string path, + ZipWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(path, writerOptions); + } + + public static IAsyncWriter OpenAsync( + Stream stream, + ZipWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(stream, writerOptions); + } + + public static IAsyncWriter OpenAsync( + FileInfo fileInfo, + ZipWriterOptions writerOptions, + CancellationToken cancellationToken = default + ) + { + cancellationToken.ThrowIfCancellationRequested(); + return (IAsyncWriter)Open(fileInfo, writerOptions); + } +} +#endif diff --git a/src/SharpCompress/Writers/Zip/ZipWriter.cs b/src/SharpCompress/Writers/Zip/ZipWriter.cs index 845856b8..dc8929b8 100644 --- a/src/SharpCompress/Writers/Zip/ZipWriter.cs +++ b/src/SharpCompress/Writers/Zip/ZipWriter.cs @@ -18,7 +18,7 @@ using SharpCompress.IO; namespace SharpCompress.Writers.Zip; -public class ZipWriter : AbstractWriter +public partial class ZipWriter : AbstractWriter { private readonly CompressionType compressionType; private readonly int compressionLevel;