diff --git a/SabreTools.Helper/SabreTools.Helper.csproj b/SabreTools.Helper/SabreTools.Helper.csproj index 896fd388..a798d825 100644 --- a/SabreTools.Helper/SabreTools.Helper.csproj +++ b/SabreTools.Helper/SabreTools.Helper.csproj @@ -68,6 +68,8 @@ ..\packages\Mono.Data.Sqlite.Portable.1.0.3.5\lib\net4\System.Data.Portable.dll True + + ..\packages\Mono.Data.Sqlite.Portable.1.0.3.5\lib\net4\System.Transactions.Portable.dll diff --git a/SabreTools.Helper/Tools/ArchiveTools.cs b/SabreTools.Helper/Tools/ArchiveTools.cs index 87d6292b..8a350e8e 100644 --- a/SabreTools.Helper/Tools/ArchiveTools.cs +++ b/SabreTools.Helper/Tools/ArchiveTools.cs @@ -1,7 +1,6 @@ using SharpCompress.Archive; using SharpCompress.Common; using SharpCompress.Reader; -using SharpCompress.Writer; using System; using System.IO; using System.IO.Compression; @@ -17,67 +16,44 @@ namespace SabreTools.Helper /// /// 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 WriteFileToArchive(string input, string output, ArchiveType archiveType, RomData rom) + public static void WriteToArchive(string input, string output, RomData rom) { string archiveFileName = output + Path.DirectorySeparatorChar + rom.Game + ".zip"; - string singleFileName = output + Path.DirectorySeparatorChar + rom.Game + Path.DirectorySeparatorChar + rom.Name; - IWritableArchive outarchive = null; + ZipArchive outarchive = null; try { if (!File.Exists(archiveFileName)) { - outarchive = ArchiveFactory.Create(archiveType) as IWritableArchive; + outarchive = ZipFile.Open(archiveFileName, ZipArchiveMode.Create); } else { - outarchive = ArchiveFactory.Open(archiveFileName, Options.LookForHeader) as IWritableArchive; + outarchive = ZipFile.Open(archiveFileName, ZipArchiveMode.Update); + } + + if (File.Exists(input)) + { + if (outarchive.Mode == ZipArchiveMode.Create || outarchive.GetEntry(rom.Name) == null) + { + outarchive.CreateEntryFromFile(input, rom.Name, CompressionLevel.Optimal); + } + } + else if (Directory.Exists(input)) + { + foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories)) + { + if (outarchive.Mode == ZipArchiveMode.Create || outarchive.GetEntry(file) == null) + { + outarchive.CreateEntryFromFile(file, file, CompressionLevel.Optimal); + } + } } - outarchive.AddEntry(rom.Name, input); - outarchive.SaveTo(archiveFileName, new CompressionInfo { Type = CompressionType.Deflate }); } catch (Exception ex) { Console.WriteLine(ex); - outarchive?.SaveTo(archiveFileName, new CompressionInfo { Type = CompressionType.Deflate }); - } - finally - { - outarchive?.Dispose(); - } - } - - /// - /// 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 WriteFolderToArchive(string input, string output, ArchiveType archiveType) - { - string archiveFileName = output + Path.DirectorySeparatorChar + Path.GetFileNameWithoutExtension(input) + ".zip"; - - IWritableArchive outarchive = null; - try - { - if (!File.Exists(archiveFileName)) - { - outarchive = ArchiveFactory.Create(archiveType) as IWritableArchive; - } - else - { - outarchive = ArchiveFactory.Open(archiveFileName, Options.LookForHeader) as IWritableArchive; - } - outarchive.AddAllFromDirectory(input, "*", SearchOption.AllDirectories); - outarchive.SaveTo(archiveFileName, new CompressionInfo { Type = CompressionType.Deflate }); - } - catch (Exception ex) - { - Console.WriteLine(ex); - outarchive?.SaveTo(archiveFileName, new CompressionInfo { Type = CompressionType.Deflate }); } finally { @@ -144,9 +120,11 @@ namespace SabreTools.Helper DirectoryInfo di = Directory.CreateDirectory(tempdir); // Extract all files to the temp directory - IReader reader = archive.ExtractAllEntries(); - reader.WriteAllToDirectory(tempdir, ExtractOptions.ExtractFullPath); - encounteredErrors = false; + using (IReader reader = archive.ExtractAllEntries()) + { + reader.WriteAllToDirectory(tempdir, ExtractOptions.ExtractFullPath); + encounteredErrors = false; + } } else if (at == ArchiveType.GZip && gz != ArchiveScanLevel.External) { @@ -168,24 +146,19 @@ namespace SabreTools.Helper } 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(); - } + } + finally + { + archive?.Dispose(); } return !encounteredErrors; diff --git a/SimpleSort/SimpleSort.cs b/SimpleSort/SimpleSort.cs index c03828e7..55e603f8 100644 --- a/SimpleSort/SimpleSort.cs +++ b/SimpleSort/SimpleSort.cs @@ -286,23 +286,19 @@ namespace SabreTools } } - // Now process the output directory and write all to zipfiles - foreach (string dir in Directory.EnumerateDirectories(_outdir, "*", SearchOption.TopDirectoryOnly)) + // Now one final delete of the temp directory + while (Directory.Exists(_tempdir)) { - ArchiveTools.WriteFolderToArchive(dir, _outdir, ArchiveType.Zip); try { - Directory.Delete(dir, true); + Directory.Delete(_tempdir, true); } - catch (Exception ex) + catch { - _logger.Error(ex.ToString()); + continue; } } - // Now one final delete of the temp directory - Directory.Delete(_tempdir, true); - return success; } @@ -363,8 +359,7 @@ namespace SabreTools foreach (RomData found in foundroms) { _logger.Log("Matched name: " + found.Name); - string singleFileName = _outdir + Path.DirectorySeparatorChar + found.Game + Path.DirectorySeparatorChar + found.Name; - Output.CopyFileToNewLocation(input, singleFileName); + ArchiveTools.WriteToArchive(input, _outdir, found); } // Now get the headerless file if it exists @@ -388,20 +383,16 @@ namespace SabreTools _logger.User("File '" + newinput + "' had " + founddroms.Count + " matches in the DAT!"); foreach (RomData found in founddroms) { - _logger.Log("Matched name: " + found.Name); - // First output the headerless rom - string singleFileName = _outdir + Path.DirectorySeparatorChar + found.Game + Path.DirectorySeparatorChar + found.Name; - Output.CopyFileToNewLocation(newinput, singleFileName); + _logger.Log("Matched name: " + found.Name); + ArchiveTools.WriteToArchive(newinput, _outdir, found); // Then output the headered rom (renamed) RomData newfound = found; newfound.Name = Path.GetFileNameWithoutExtension(newfound.Name) + " (" + rom.CRC + ")" + Path.GetExtension(newfound.Name); _logger.Log("Matched name: " + newfound.Name); - - singleFileName = _outdir + Path.DirectorySeparatorChar + newfound.Game + Path.DirectorySeparatorChar + newfound.Name; - Output.CopyFileToNewLocation(input, singleFileName); + ArchiveTools.WriteToArchive(input, _outdir, newfound); } // Now remove this temporary file @@ -415,7 +406,14 @@ namespace SabreTools // Remove the current file if we are in recursion so it's not picked up in the next step if (recurse) { - File.Delete(input); + try + { + File.Delete(input); + } + catch (Exception ex) + { + _logger.Error(ex.ToString()); + } } // If no errors were encountered, we loop through the temp directory