From e4ce41f295735e3fb1cc4a90fd5ce575978ae737 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 13 Jun 2016 20:57:49 -0700 Subject: [PATCH] [ArchiveTools] Extract out archive-specific methods --- SabreTools.Helper/SabreTools.Helper.csproj | 1 + SabreTools.Helper/Tools/ArchiveTools.cs | 155 +++++++++++++++++++++ SimpleSort/SimpleSort.cs | 150 +------------------- 3 files changed, 158 insertions(+), 148 deletions(-) create mode 100644 SabreTools.Helper/Tools/ArchiveTools.cs diff --git a/SabreTools.Helper/SabreTools.Helper.csproj b/SabreTools.Helper/SabreTools.Helper.csproj index 17e0bea2..330f4a68 100644 --- a/SabreTools.Helper/SabreTools.Helper.csproj +++ b/SabreTools.Helper/SabreTools.Helper.csproj @@ -83,6 +83,7 @@ + diff --git a/SabreTools.Helper/Tools/ArchiveTools.cs b/SabreTools.Helper/Tools/ArchiveTools.cs new file mode 100644 index 00000000..afdd4e98 --- /dev/null +++ b/SabreTools.Helper/Tools/ArchiveTools.cs @@ -0,0 +1,155 @@ +using System; +using System.IO; +using System.IO.Compression; + +using SharpCompress.Archive; +using SharpCompress.Common; +using SharpCompress.Reader; +using SharpCompress.Writer; + +namespace SabreTools.Helper +{ + public class ArchiveTools + { + /// + /// Copy a file either to an output archive or to an output folder + /// + /// Input filename to be moved + /// Output directory to build to + /// Type of archive to attempt to write to + /// RomData representing the new information + public static void WriteArchiveOrFile(string input, string output, ArchiveType archiveType, RomData rom) + { + string archiveFileName = output + Path.DirectorySeparatorChar + rom.Game + ".zip"; + string singleFileName = output + Path.DirectorySeparatorChar + rom.Game + Path.DirectorySeparatorChar + rom.Name; + + IWriter outarchive = null; + FileStream fs = null; + try + { + fs = File.OpenWrite(archiveFileName); + outarchive = WriterFactory.Open(fs, ArchiveType.Zip, CompressionType.Deflate); + outarchive.Write(rom.Name, input); + } + catch + { + if (!File.Exists(singleFileName)) + { + File.Copy(input, singleFileName); + } + } + finally + { + outarchive?.Dispose(); + fs?.Close(); + fs?.Dispose(); + } + } + + /// + /// Attempt to extract a file as an archive + /// + /// Name of the file to be extracted + /// Temporary directory for archive extraction + /// Logger object for file and console output + /// True if the extraction was a success, false otherwise + public static bool ExtractArchive(string input, string tempdir, Logger logger) + { + return ExtractArchive(input, tempdir, ArchiveScanLevel.Both, ArchiveScanLevel.External, ArchiveScanLevel.External, ArchiveScanLevel.Both, logger); + } + + /// + /// Attempt to extract a file as an archive + /// + /// Name of the file to be extracted + /// Temporary directory for archive extraction + /// Integer representing the archive handling level for 7z + /// Integer representing the archive handling level for GZip + /// Integer representing the archive handling level for RAR + /// Integer representing the archive handling level for Zip + /// Logger object for file and console output + /// True if the extraction was a success, false otherwise + public static bool ExtractArchive(string input, string tempdir, int sevenzip, + int gz, int rar, int zip, Logger logger) + { + return ExtractArchive(input, tempdir, (ArchiveScanLevel)sevenzip, (ArchiveScanLevel)gz, (ArchiveScanLevel)rar, (ArchiveScanLevel)zip, logger); + } + + /// + /// Attempt to extract a file as an archive + /// + /// Name of the file to be extracted + /// Temporary directory for archive extraction + /// Archive handling level for 7z + /// Archive handling level for GZip + /// Archive handling level for RAR + /// Archive handling level for Zip + /// Logger object for file and console output + /// True if the extraction was a success, false otherwise + public static bool ExtractArchive(string input, string tempdir, ArchiveScanLevel sevenzip, + ArchiveScanLevel gz, ArchiveScanLevel rar, ArchiveScanLevel zip, Logger logger) + { + bool encounteredErrors = true; + IArchive archive = null; + try + { + archive = ArchiveFactory.Open(input); + ArchiveType at = archive.Type; + logger.Log("Found archive of type: " + at); + + if ((at == ArchiveType.Zip && zip != ArchiveScanLevel.External) || + (at == ArchiveType.SevenZip && sevenzip != ArchiveScanLevel.External) || + (at == ArchiveType.Rar && rar != ArchiveScanLevel.External)) + { + // Create the temp directory + DirectoryInfo di = Directory.CreateDirectory(tempdir); + + // Extract all files to the temp directory + IReader reader = archive.ExtractAllEntries(); + reader.WriteAllToDirectory(tempdir, ExtractOptions.ExtractFullPath); + encounteredErrors = false; + } + else if (at == ArchiveType.GZip && gz != ArchiveScanLevel.External) + { + // Close the original archive handle + archive.Dispose(); + + // Create the temp directory + DirectoryInfo di = Directory.CreateDirectory(tempdir); + + using (FileStream itemstream = File.OpenRead(input)) + { + using (FileStream outstream = File.Create(tempdir + Path.GetFileNameWithoutExtension(input))) + { + using (GZipStream gzstream = new GZipStream(itemstream, CompressionMode.Decompress)) + { + gzstream.CopyTo(outstream); + } + } + } + encounteredErrors = false; + } + archive.Dispose(); + } + catch (InvalidOperationException) + { + encounteredErrors = true; + if (archive != null) + { + archive.Dispose(); + } + } + catch (Exception ex) + { + logger.Error(ex.ToString()); + encounteredErrors = true; + if (archive != null) + { + archive.Dispose(); + } + } + + return !encounteredErrors; + } + } +} diff --git a/SimpleSort/SimpleSort.cs b/SimpleSort/SimpleSort.cs index 17636012..e0373991 100644 --- a/SimpleSort/SimpleSort.cs +++ b/SimpleSort/SimpleSort.cs @@ -1,16 +1,11 @@ using System; using System.Collections.Generic; using System.IO; -using System.IO.Compression; -using System.Linq; using System.Security.Cryptography; using SabreTools.Helper; using DamienG.Security.Cryptography; -using SharpCompress.Archive; using SharpCompress.Common; -using SharpCompress.Reader; -using SharpCompress.Writer; namespace SabreTools { @@ -317,11 +312,11 @@ namespace SabreTools _logger.User("File '" + input + "' had " + foundroms.Count + " matches in the DAT!"); foreach (RomData found in foundroms) { - WriteFix(input, _outdir, ArchiveType.Zip, found); + ArchiveTools.WriteArchiveOrFile(input, _outdir, ArchiveType.Zip, found); } // Now, if the file is a supported archive type, also run on all files within - bool encounteredErrors = !ExtractArchive(input, _tempdir, _7z, _gz, _rar, _zip, _logger); + bool encounteredErrors = !ArchiveTools.ExtractArchive(input, _tempdir, _7z, _gz, _rar, _zip, _logger); // Remove the current file if we are in recursion so it's not picked up in the next step if (recurse) @@ -388,146 +383,5 @@ namespace SabreTools return rom; } - - /// - /// Copy a file either to an output archive or to an output folder - /// - /// Input filename to be moved - /// Output directory to build to - /// Type of archive to attempt to write to - /// RomData representing the new information - public static void WriteFix(string input, string output, ArchiveType archiveType, RomData rom) - { - string archiveFileName = output + Path.DirectorySeparatorChar + rom.Game + ".zip"; - string singleFileName = output + Path.DirectorySeparatorChar + rom.Game + Path.DirectorySeparatorChar + rom.Name; - - IWriter outarchive = null; - FileStream fs = null; - try - { - fs = File.OpenWrite(archiveFileName); - outarchive = WriterFactory.Open(fs, ArchiveType.Zip, CompressionType.Deflate); - outarchive.Write(rom.Name, input); - } - catch - { - if (!File.Exists(singleFileName)) - { - File.Copy(input, singleFileName); - } - } - finally - { - outarchive?.Dispose(); - fs?.Close(); - fs?.Dispose(); - } - } - - /// - /// Attempt to extract a file as an archive - /// - /// Name of the file to be extracted - /// Temporary directory for archive extraction - /// Logger object for file and console output - /// True if the extraction was a success, false otherwise - public static bool ExtractArchive(string input, string tempdir, Logger logger) - { - return ExtractArchive(input, tempdir, ArchiveScanLevel.Both, ArchiveScanLevel.External, ArchiveScanLevel.External, ArchiveScanLevel.Both, logger); - } - - /// - /// Attempt to extract a file as an archive - /// - /// Name of the file to be extracted - /// Temporary directory for archive extraction - /// Integer representing the archive handling level for 7z - /// Integer representing the archive handling level for GZip - /// Integer representing the archive handling level for RAR - /// Integer representing the archive handling level for Zip - /// Logger object for file and console output - /// True if the extraction was a success, false otherwise - public static bool ExtractArchive(string input, string tempdir, int sevenzip, - int gz, int rar, int zip, Logger logger) - { - return ExtractArchive(input, tempdir, (ArchiveScanLevel)sevenzip, (ArchiveScanLevel)gz, (ArchiveScanLevel)rar, (ArchiveScanLevel)zip, logger); - } - - /// - /// Attempt to extract a file as an archive - /// - /// Name of the file to be extracted - /// Temporary directory for archive extraction - /// Archive handling level for 7z - /// Archive handling level for GZip - /// Archive handling level for RAR - /// Archive handling level for Zip - /// Logger object for file and console output - /// True if the extraction was a success, false otherwise - public static bool ExtractArchive(string input, string tempdir, ArchiveScanLevel sevenzip, - ArchiveScanLevel gz, ArchiveScanLevel rar, ArchiveScanLevel zip, Logger logger) - { - bool encounteredErrors = true; - IArchive archive = null; - try - { - archive = ArchiveFactory.Open(input); - ArchiveType at = archive.Type; - logger.Log("Found archive of type: " + at); - - if ((at == ArchiveType.Zip && zip != ArchiveScanLevel.External) || - (at == ArchiveType.SevenZip && sevenzip != ArchiveScanLevel.External) || - (at == ArchiveType.Rar && rar != ArchiveScanLevel.External)) - { - // Create the temp directory - DirectoryInfo di = Directory.CreateDirectory(tempdir); - - // Extract all files to the temp directory - IReader reader = archive.ExtractAllEntries(); - reader.WriteAllToDirectory(tempdir, ExtractOptions.ExtractFullPath); - encounteredErrors = false; - } - else if (at == ArchiveType.GZip && gz != ArchiveScanLevel.External) - { - // Close the original archive handle - archive.Dispose(); - - // Create the temp directory - DirectoryInfo di = Directory.CreateDirectory(tempdir); - - using (FileStream itemstream = File.OpenRead(input)) - { - using (FileStream outstream = File.Create(tempdir + Path.GetFileNameWithoutExtension(input))) - { - using (GZipStream gzstream = new GZipStream(itemstream, CompressionMode.Decompress)) - { - gzstream.CopyTo(outstream); - } - } - } - encounteredErrors = false; - } - archive.Dispose(); - } - catch (InvalidOperationException) - { - encounteredErrors = true; - if (archive != null) - { - archive.Dispose(); - } - } - catch (Exception ex) - { - logger.Error(ex.ToString()); - encounteredErrors = true; - if (archive != null) - { - archive.Dispose(); - } - } - - return !encounteredErrors; - } } }