From e37e8bdadc534190068048ff6cecea6f0744cab7 Mon Sep 17 00:00:00 2001 From: Adam Hathcock Date: Thu, 28 Jun 2018 11:46:51 +0100 Subject: [PATCH] Move path handling for extraction to be common Reader and Archive now share more extraction logic --- .../Archives/IArchiveEntryExtensions.cs | 73 +++------------- .../Archives/IArchiveExtensions.cs | 2 +- src/SharpCompress/Common/ExtractionMethods.cs | 87 +++++++++++++++++++ .../{Readers => Common}/ExtractionOptions.cs | 2 +- .../Readers/IReaderExtensions.cs | 55 +++--------- 5 files changed, 110 insertions(+), 109 deletions(-) create mode 100644 src/SharpCompress/Common/ExtractionMethods.cs rename src/SharpCompress/{Readers => Common}/ExtractionOptions.cs (94%) diff --git a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs index d66669b9..e1716fb3 100644 --- a/src/SharpCompress/Archives/IArchiveEntryExtensions.cs +++ b/src/SharpCompress/Archives/IArchiveEntryExtensions.cs @@ -1,7 +1,6 @@ using System.IO; using SharpCompress.Common; using SharpCompress.IO; -using SharpCompress.Readers; namespace SharpCompress.Archives { @@ -46,50 +45,8 @@ namespace SharpCompress.Archives public static void WriteToDirectory(this IArchiveEntry entry, string destinationDirectory, ExtractionOptions options = null) { - string destinationFileName; - string file = Path.GetFileName(entry.Key); - string fullDestinationDirectoryPath = Path.GetFullPath(destinationDirectory); - - options = options ?? new ExtractionOptions() - { - Overwrite = true - }; - - - if (options.ExtractFullPath) - { - string folder = Path.GetDirectoryName(entry.Key); - string destdir = Path.GetFullPath( - Path.Combine(fullDestinationDirectoryPath, folder) - ); - - if (!Directory.Exists(destdir)) - { - if (!destdir.StartsWith(fullDestinationDirectoryPath)) - { - throw new ExtractionException("Entry is trying to create a directory outside of the destination directory."); - } - - Directory.CreateDirectory(destdir); - } - destinationFileName = Path.Combine(destdir, file); - } - else - { - destinationFileName = Path.Combine(fullDestinationDirectoryPath, file); - } - - if (!entry.IsDirectory) - { - destinationFileName = Path.GetFullPath(destinationFileName); - - if (!destinationFileName.StartsWith(fullDestinationDirectoryPath)) - { - throw new ExtractionException("Entry is trying to write a file outside of the destination directory."); - } - - entry.WriteToFile(destinationFileName, options); - } + ExtractionMethods.WriteEntryToDirectory(entry, destinationDirectory, options, + entry.WriteToFile); } /// @@ -98,23 +55,15 @@ namespace SharpCompress.Archives public static void WriteToFile(this IArchiveEntry entry, string destinationFileName, ExtractionOptions options = null) { - FileMode fm = FileMode.Create; - options = options ?? new ExtractionOptions() - { - Overwrite = true - }; - - - if (!options.Overwrite) - { - fm = FileMode.CreateNew; - } - using (FileStream fs = File.Open(destinationFileName, fm)) - { - entry.WriteTo(fs); - } - - entry.PreserveExtractionOptions(destinationFileName, options); + + ExtractionMethods.WriteEntryToFile(entry, destinationFileName, options, + (x, fm) => + { + using (FileStream fs = File.Open(destinationFileName, fm)) + { + entry.WriteTo(fs); + } + }); } #endif } diff --git a/src/SharpCompress/Archives/IArchiveExtensions.cs b/src/SharpCompress/Archives/IArchiveExtensions.cs index 5f9d9e54..7b669666 100644 --- a/src/SharpCompress/Archives/IArchiveExtensions.cs +++ b/src/SharpCompress/Archives/IArchiveExtensions.cs @@ -1,6 +1,6 @@ #if !NO_FILE using System.Linq; -using SharpCompress.Readers; +using SharpCompress.Common; #endif diff --git a/src/SharpCompress/Common/ExtractionMethods.cs b/src/SharpCompress/Common/ExtractionMethods.cs new file mode 100644 index 00000000..71e67a97 --- /dev/null +++ b/src/SharpCompress/Common/ExtractionMethods.cs @@ -0,0 +1,87 @@ +#if !NO_FILE +using System; +using System.IO; +#endif + +namespace SharpCompress.Common +{ + internal static class ExtractionMethods + { + +#if !NO_FILE + /// + /// Extract to specific directory, retaining filename + /// + public static void WriteEntryToDirectory(IEntry entry, string destinationDirectory, + ExtractionOptions options, Action write) + { + string destinationFileName; + string file = Path.GetFileName(entry.Key); + string fullDestinationDirectoryPath = Path.GetFullPath(destinationDirectory); + + options = options ?? new ExtractionOptions() + { + Overwrite = true + }; + + if (options.ExtractFullPath) + { + string folder = Path.GetDirectoryName(entry.Key); + string destdir = Path.GetFullPath( + Path.Combine(fullDestinationDirectoryPath, folder) + ); + + if (!Directory.Exists(destdir)) + { + if (!destdir.StartsWith(fullDestinationDirectoryPath)) + { + throw new ExtractionException("Entry is trying to create a directory outside of the destination directory."); + } + + Directory.CreateDirectory(destdir); + } + destinationFileName = Path.Combine(destdir, file); + } + else + { + destinationFileName = Path.Combine(fullDestinationDirectoryPath, file); + + } + + if (!entry.IsDirectory) + { + destinationFileName = Path.GetFullPath(destinationFileName); + + if (!destinationFileName.StartsWith(fullDestinationDirectoryPath)) + { + throw new ExtractionException("Entry is trying to write a file outside of the destination directory."); + } + write(destinationFileName, options); + } + else if (options.ExtractFullPath && !Directory.Exists(destinationFileName)) + { + Directory.CreateDirectory(destinationFileName); + } + } + + public static void WriteEntryToFile(IEntry entry, string destinationFileName, + ExtractionOptions options, + Action openAndWrite) + { + FileMode fm = FileMode.Create; + options = options ?? new ExtractionOptions() + { + Overwrite = true + }; + + if (!options.Overwrite) + { + fm = FileMode.CreateNew; + } + + openAndWrite(destinationFileName, fm); + entry.PreserveExtractionOptions(destinationFileName, options); + } +#endif + } +} \ No newline at end of file diff --git a/src/SharpCompress/Readers/ExtractionOptions.cs b/src/SharpCompress/Common/ExtractionOptions.cs similarity index 94% rename from src/SharpCompress/Readers/ExtractionOptions.cs rename to src/SharpCompress/Common/ExtractionOptions.cs index ef06b1ff..9dba482e 100644 --- a/src/SharpCompress/Readers/ExtractionOptions.cs +++ b/src/SharpCompress/Common/ExtractionOptions.cs @@ -1,4 +1,4 @@ -namespace SharpCompress.Readers +namespace SharpCompress.Common { public class ExtractionOptions { diff --git a/src/SharpCompress/Readers/IReaderExtensions.cs b/src/SharpCompress/Readers/IReaderExtensions.cs index 65ef90ed..d63cc967 100644 --- a/src/SharpCompress/Readers/IReaderExtensions.cs +++ b/src/SharpCompress/Readers/IReaderExtensions.cs @@ -42,36 +42,8 @@ namespace SharpCompress.Readers public static void WriteEntryToDirectory(this IReader reader, string destinationDirectory, ExtractionOptions options = null) { - string destinationFileName = string.Empty; - string file = Path.GetFileName(reader.Entry.Key); - options = options ?? new ExtractionOptions() - { - Overwrite = true - }; - - if (options.ExtractFullPath) - { - string folder = Path.GetDirectoryName(reader.Entry.Key); - string destdir = Path.Combine(destinationDirectory, folder); - if (!Directory.Exists(destdir)) - { - Directory.CreateDirectory(destdir); - } - destinationFileName = Path.Combine(destdir, file); - } - else - { - destinationFileName = Path.Combine(destinationDirectory, file); - } - - if (!reader.Entry.IsDirectory) - { - reader.WriteEntryToFile(destinationFileName, options); - } - else if (options.ExtractFullPath && !Directory.Exists(destinationFileName)) - { - Directory.CreateDirectory(destinationFileName); - } + ExtractionMethods.WriteEntryToDirectory(reader.Entry, destinationDirectory, options, + reader.WriteEntryToFile); } /// @@ -80,21 +52,14 @@ namespace SharpCompress.Readers public static void WriteEntryToFile(this IReader reader, string destinationFileName, ExtractionOptions options = null) { - FileMode fm = FileMode.Create; - options = options ?? new ExtractionOptions() - { - Overwrite = true - }; - - if (!options.Overwrite) - { - fm = FileMode.CreateNew; - } - using (FileStream fs = File.Open(destinationFileName, fm)) - { - reader.WriteEntryTo(fs); - } - reader.Entry.PreserveExtractionOptions(destinationFileName, options); + ExtractionMethods.WriteEntryToFile(reader.Entry, destinationFileName, options, + (x, fm) => + { + using (FileStream fs = File.Open(destinationFileName, fm)) + { + reader.WriteEntryTo(fs); + } + }); } #endif }