diff --git a/src/SharpCompress/Archives/ArchiveFactory.cs b/src/SharpCompress/Archives/ArchiveFactory.cs index 33a1ecc5..91a4ad32 100644 --- a/src/SharpCompress/Archives/ArchiveFactory.cs +++ b/src/SharpCompress/Archives/ArchiveFactory.cs @@ -94,11 +94,11 @@ public static partial class ArchiveFactory public static void WriteToDirectory( string sourceArchive, string destinationDirectory, - ExtractionOptions? options = null + ReaderOptions? options = null ) { - using var archive = OpenArchive(sourceArchive); - archive.WriteToDirectory(destinationDirectory, options); + using var archive = OpenArchive(sourceArchive, options); + archive.WriteToDirectory(destinationDirectory); } public static T FindFactory(string path) diff --git a/src/SharpCompress/Common/ExtractionMethods.Async.cs b/src/SharpCompress/Common/ExtractionMethods.Async.cs index f2c3ac13..65f502b0 100644 --- a/src/SharpCompress/Common/ExtractionMethods.Async.cs +++ b/src/SharpCompress/Common/ExtractionMethods.Async.cs @@ -2,6 +2,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using SharpCompress.Readers; namespace SharpCompress.Common; @@ -10,8 +11,8 @@ internal static partial class ExtractionMethods public static async ValueTask WriteEntryToDirectoryAsync( IEntry entry, string destinationDirectory, - ExtractionOptions? options, - Func writeAsync, + ReaderOptions? options, + Func writeAsync, CancellationToken cancellationToken = default ) { @@ -34,7 +35,7 @@ internal static partial class ExtractionMethods ); } - options ??= new ExtractionOptions() { Overwrite = true }; + options ??= new ReaderOptions { Overwrite = true }; var file = Path.GetFileName(entry.Key.NotNull("Entry Key is null")).NotNull("File is null"); file = Utility.ReplaceInvalidFileNameChars(file); @@ -83,7 +84,7 @@ internal static partial class ExtractionMethods public static async ValueTask WriteEntryToFileAsync( IEntry entry, string destinationFileName, - ExtractionOptions? options, + ReaderOptions? options, Func openAndWriteAsync, CancellationToken cancellationToken = default ) @@ -96,14 +97,14 @@ internal static partial class ExtractionMethods } else { - ExtractionOptions.DefaultSymbolicLinkHandler(destinationFileName, entry.LinkTarget); + ReaderOptions.DefaultSymbolicLinkHandler(destinationFileName, entry.LinkTarget); } return; } else { var fm = FileMode.Create; - options ??= new ExtractionOptions() { Overwrite = true }; + options ??= new ReaderOptions { Overwrite = true }; if (!options.Overwrite) { diff --git a/src/SharpCompress/Common/ExtractionMethods.cs b/src/SharpCompress/Common/ExtractionMethods.cs index ab6e986b..50a783b7 100644 --- a/src/SharpCompress/Common/ExtractionMethods.cs +++ b/src/SharpCompress/Common/ExtractionMethods.cs @@ -3,6 +3,8 @@ using System.IO; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; +using SharpCompress.Common.Options; +using SharpCompress.Readers; namespace SharpCompress.Common; @@ -23,8 +25,8 @@ internal static partial class ExtractionMethods public static void WriteEntryToDirectory( IEntry entry, string destinationDirectory, - ExtractionOptions? options, - Action write + ReaderOptions? options, + Action write ) { string destinationFileName; @@ -46,7 +48,7 @@ internal static partial class ExtractionMethods ); } - options ??= new ExtractionOptions() { Overwrite = true }; + options ??= new ReaderOptions { Overwrite = true }; var file = Path.GetFileName(entry.Key.NotNull("Entry Key is null")).NotNull("File is null"); file = Utility.ReplaceInvalidFileNameChars(file); @@ -95,7 +97,7 @@ internal static partial class ExtractionMethods public static void WriteEntryToFile( IEntry entry, string destinationFileName, - ExtractionOptions? options, + ReaderOptions? options, Action openAndWrite ) { @@ -107,14 +109,14 @@ internal static partial class ExtractionMethods } else { - ExtractionOptions.DefaultSymbolicLinkHandler(destinationFileName, entry.LinkTarget); + ReaderOptions.DefaultSymbolicLinkHandler(destinationFileName, entry.LinkTarget); } return; } else { var fm = FileMode.Create; - options ??= new ExtractionOptions() { Overwrite = true }; + options ??= new ReaderOptions { Overwrite = true }; if (!options.Overwrite) { diff --git a/src/SharpCompress/Common/IEntry.Extensions.cs b/src/SharpCompress/Common/IEntry.Extensions.cs index 7e9b79a3..76d9fe49 100644 --- a/src/SharpCompress/Common/IEntry.Extensions.cs +++ b/src/SharpCompress/Common/IEntry.Extensions.cs @@ -1,4 +1,5 @@ using System.IO; +using SharpCompress.Readers; namespace SharpCompress.Common; @@ -7,7 +8,7 @@ internal static class EntryExtensions internal static void PreserveExtractionOptions( this IEntry entry, string destinationFileName, - ExtractionOptions options + ReaderOptions options ) { if (options.PreserveFileTime || options.PreserveAttributes) diff --git a/src/SharpCompress/Common/Options/IExtractionOptions.cs b/src/SharpCompress/Common/Options/IExtractionOptions.cs new file mode 100644 index 00000000..3e88d247 --- /dev/null +++ b/src/SharpCompress/Common/Options/IExtractionOptions.cs @@ -0,0 +1,39 @@ +using System; + +namespace SharpCompress.Common.Options; + +/// +/// Options for configuring extraction behavior when extracting archive entries to the filesystem. +/// +public interface IExtractionOptions +{ + /// + /// Overwrite target if it exists. + /// Breaking change: Default changed from false to true in version 0.40.0. + /// + bool Overwrite { get; init; } + + /// + /// Extract with internal directory structure. + /// Breaking change: Default changed from false to true in version 0.40.0. + /// + bool ExtractFullPath { get; init; } + + /// + /// Preserve file time. + /// Breaking change: Default changed from false to true in version 0.40.0. + /// + bool PreserveFileTime { get; init; } + + /// + /// Preserve windows file attributes. + /// + bool PreserveAttributes { get; init; } + + /// + /// Delegate for writing symbolic links to disk. + /// The first parameter is the source path (where the symlink is created). + /// The second parameter is the target path (what the symlink refers to). + /// + Action? SymbolicLinkHandler { get; init; } +} diff --git a/src/SharpCompress/Common/Options/IReaderOptions.cs b/src/SharpCompress/Common/Options/IReaderOptions.cs index 0214afeb..d9f51880 100644 --- a/src/SharpCompress/Common/Options/IReaderOptions.cs +++ b/src/SharpCompress/Common/Options/IReaderOptions.cs @@ -1,6 +1,10 @@ namespace SharpCompress.Common.Options; -public interface IReaderOptions : IStreamOptions, IEncodingOptions, IProgressOptions, IExtractionOptions +public interface IReaderOptions + : IStreamOptions, + IEncodingOptions, + IProgressOptions, + IExtractionOptions { bool LookForHeader { get; init; } string? Password { get; init; }