diff --git a/DATabase/DATabase.cs b/DATabase/DATabase.cs
index 67ff1b54..4f75c766 100644
--- a/DATabase/DATabase.cs
+++ b/DATabase/DATabase.cs
@@ -643,10 +643,7 @@ namespace SabreTools
// Split a DAT by extension
else if (extsplit)
{
- foreach (string input in inputs)
- {
- InitExtSplit(input, exta, extb, outdir);
- }
+ InitExtSplit(inputs, exta, extb, outdir);
}
// Merge, diff, and dedupe at least 2 DATs
diff --git a/DATabase/DATabase.csproj b/DATabase/DATabase.csproj
index fd42f586..807c81ea 100644
--- a/DATabase/DATabase.csproj
+++ b/DATabase/DATabase.csproj
@@ -104,11 +104,10 @@
-
+
-
diff --git a/DATabase/ExtSplit.cs b/DATabase/ExtSplit.cs
deleted file mode 100644
index 2b949609..00000000
--- a/DATabase/ExtSplit.cs
+++ /dev/null
@@ -1,176 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-
-using SabreTools.Helper;
-
-namespace SabreTools
-{
- public class ExtSplit
- {
- // Instance variables
- private List _extA;
- private List _extB;
- private string _filename;
- private string _outdir;
- private static Logger _logger;
-
- ///
- /// Create a new DatSplit object
- ///
- /// Filename of the DAT to split
- /// List of extensions to split on (first DAT)
- /// List of extensions to split on (second DAT)
- /// Logger object for console and file writing
- public ExtSplit(string filename, List extA, List extB, string outdir, Logger logger)
- {
- _filename = filename.Replace("\"", "");
- _extA = new List();
- foreach (string s in extA)
- {
- _extA.Add((s.StartsWith(".") ? s : "." + s).ToUpperInvariant());
- }
- _extB = new List();
- foreach (string s in extB)
- {
- _extB.Add((s.StartsWith(".") ? s : "." + s).ToUpperInvariant());
- }
- _outdir = outdir.Replace("\"", "");
- _logger = logger;
- }
-
- ///
- /// Split a DAT based on filtering by 2 extensions
- ///
- /// True if DAT was split, false otherwise
- public bool Split()
- {
- // If file doesn't exist, error and return
- if (!File.Exists(_filename))
- {
- _logger.Error("File '" + _filename + "' doesn't exist");
- return false;
- }
-
- // If it's empty, use the current folder
- if (_outdir.Trim() == "")
- {
- _outdir = Environment.CurrentDirectory;
- }
-
- // If the output directory doesn't exist, create it
- if (!Directory.Exists(_outdir))
- {
- Directory.CreateDirectory(_outdir);
- }
-
- // Load the current DAT to be processed
- DatData datdata = new DatData();
- datdata = RomManipulation.Parse(_filename, 0, 0, datdata, _logger);
-
- // Set all of the appropriate outputs for each of the subsets
- OutputFormat outputFormat = RomManipulation.GetOutputFormat(_filename);
- DatData datdataA = new DatData
- {
- FileName = datdata.FileName + " (" + String.Join(",", _extA) + ")",
- Name = datdata.Name + " (" + String.Join(",", _extA) + ")",
- Description = datdata.Description + " (" + String.Join(",", _extA) + ")",
- Category = datdata.Category,
- Version = datdata.Version,
- Date = datdata.Date,
- Author = datdata.Author,
- Email = datdata.Email,
- Homepage = datdata.Homepage,
- Url = datdata.Url,
- Comment = datdata.Comment,
- Roms = new Dictionary>(),
- OutputFormat = outputFormat,
- };
- DatData datdataB = new DatData
- {
- FileName = datdata.FileName + " (" + String.Join(",", _extB) + ")",
- Name = datdata.Name + " (" + String.Join(",", _extB) + ")",
- Description = datdata.Description + " (" + String.Join(",", _extB) + ")",
- Category = datdata.Category,
- Version = datdata.Version,
- Date = datdata.Date,
- Author = datdata.Author,
- Email = datdata.Email,
- Homepage = datdata.Homepage,
- Url = datdata.Url,
- Comment = datdata.Comment,
- Roms = new Dictionary>(),
- OutputFormat = outputFormat,
- };
-
- // If roms is empty, return false
- if (datdata.Roms.Count == 0)
- {
- return false;
- }
-
- // Now separate the roms accordingly
- foreach (string key in datdata.Roms.Keys)
- {
- foreach (RomData rom in datdata.Roms[key])
- {
- if (_extA.Contains(Path.GetExtension(rom.Name.ToUpperInvariant())))
- {
- if (datdataA.Roms.ContainsKey(key))
- {
- datdataA.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- datdataA.Roms.Add(key, temp);
- }
- }
- else if (_extB.Contains(Path.GetExtension(rom.Name.ToUpperInvariant())))
- {
- if (datdataB.Roms.ContainsKey(key))
- {
- datdataB.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- datdataB.Roms.Add(key, temp);
- }
- }
- else
- {
- if (datdataA.Roms.ContainsKey(key))
- {
- datdataA.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- datdataA.Roms.Add(key, temp);
- }
- if (datdataB.Roms.ContainsKey(key))
- {
- datdataB.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- datdataB.Roms.Add(key, temp);
- }
- }
- }
- }
-
- // Then write out both files
- bool success = Output.WriteDatfile(datdataA, _outdir, _logger);
- success &= Output.WriteDatfile(datdataB, _outdir, _logger);
-
- return success;
- }
- }
-}
diff --git a/DATabase/HashSplit.cs b/DATabase/HashSplit.cs
deleted file mode 100644
index eac78135..00000000
--- a/DATabase/HashSplit.cs
+++ /dev/null
@@ -1,264 +0,0 @@
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-
-using SabreTools.Helper;
-
-namespace SabreTools
-{
- public class HashSplit
- {
- // Internal variables
- List _inputs;
- string _outdir;
- Logger _logger;
-
- ///
- /// Create a HashSplit object
- ///
- /// The name of the file to be split
- /// Optional output directory, defaults to DAT directory
- /// Logger object for file and console output
- public HashSplit(List inputs, string outdir, Logger logger)
- {
- _inputs = inputs;
- _outdir = (outdir.EndsWith(Path.DirectorySeparatorChar.ToString()) ? outdir : outdir + Path.DirectorySeparatorChar).Replace("\"", "");
- _logger = logger;
- }
-
- ///
- /// Split the DAT into parts by best-available hash data
- ///
- /// True if the DATs were output, false otherwise
- public bool Split()
- {
- // First, clean the original filenames
- List newinputs = new List();
- foreach (string input in _inputs)
- {
- newinputs.Add(Path.GetFullPath(input.Replace("\"", "")));
- }
- _inputs = newinputs;
-
- // Now, process each file and folder in the input
- bool finalreturn = true;
- foreach (string input in _inputs)
- {
- if (File.Exists(input))
- {
- finalreturn &= SplitHelper(input, Path.GetDirectoryName(input));
- }
- if (Directory.Exists(input))
- {
- foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories))
- {
- finalreturn &= SplitHelper(Path.GetFullPath(file), (input.EndsWith(Path.DirectorySeparatorChar.ToString()) ? input : input + Path.DirectorySeparatorChar));
- }
- }
- }
-
- return finalreturn;
- }
-
- private bool SplitHelper(string filename, string basepath)
- {
- // Sanitize the basepath to be more predictable
- basepath = (basepath.EndsWith(Path.DirectorySeparatorChar.ToString()) ? basepath : basepath + Path.DirectorySeparatorChar);
-
- // Get the file data to be split
- OutputFormat outputFormat = RomManipulation.GetOutputFormat(filename);
- DatData datdata = new DatData();
- datdata = RomManipulation.Parse(filename, 0, 0, datdata, _logger, true);
-
- // Create each of the respective output DATs
- _logger.User("Creating and populating new DATs");
- DatData nodump = new DatData
- {
- FileName = datdata.FileName + " (Nodump)",
- Name = datdata.Name + " (Nodump)",
- Description = datdata.Description + " (Nodump)",
- Category = datdata.Category,
- Version = datdata.Version,
- Date = datdata.Date,
- Author = datdata.Author,
- Email = datdata.Email,
- Homepage = datdata.Homepage,
- Url = datdata.Url,
- Comment = datdata.Comment,
- Header = datdata.Header,
- Type = datdata.Type,
- ForceMerging = datdata.ForceMerging,
- ForceNodump = datdata.ForceNodump,
- ForcePacking = datdata.ForcePacking,
- OutputFormat = outputFormat,
- MergeRoms = datdata.MergeRoms,
- Roms = new Dictionary>(),
- };
- DatData sha1 = new DatData
- {
- FileName = datdata.FileName + " (SHA-1)",
- Name = datdata.Name + " (SHA-1)",
- Description = datdata.Description + " (SHA-1)",
- Category = datdata.Category,
- Version = datdata.Version,
- Date = datdata.Date,
- Author = datdata.Author,
- Email = datdata.Email,
- Homepage = datdata.Homepage,
- Url = datdata.Url,
- Comment = datdata.Comment,
- Header = datdata.Header,
- Type = datdata.Type,
- ForceMerging = datdata.ForceMerging,
- ForceNodump = datdata.ForceNodump,
- ForcePacking = datdata.ForcePacking,
- OutputFormat = outputFormat,
- MergeRoms = datdata.MergeRoms,
- Roms = new Dictionary>(),
- };
- DatData md5 = new DatData
- {
- FileName = datdata.FileName + " (MD5)",
- Name = datdata.Name + " (MD5)",
- Description = datdata.Description + " (MD5)",
- Category = datdata.Category,
- Version = datdata.Version,
- Date = datdata.Date,
- Author = datdata.Author,
- Email = datdata.Email,
- Homepage = datdata.Homepage,
- Url = datdata.Url,
- Comment = datdata.Comment,
- Header = datdata.Header,
- Type = datdata.Type,
- ForceMerging = datdata.ForceMerging,
- ForceNodump = datdata.ForceNodump,
- ForcePacking = datdata.ForcePacking,
- OutputFormat = outputFormat,
- MergeRoms = datdata.MergeRoms,
- Roms = new Dictionary>(),
- };
- DatData crc = new DatData
- {
- FileName = datdata.FileName + " (CRC)",
- Name = datdata.Name + " (CRC)",
- Description = datdata.Description + " (CRC)",
- Category = datdata.Category,
- Version = datdata.Version,
- Date = datdata.Date,
- Author = datdata.Author,
- Email = datdata.Email,
- Homepage = datdata.Homepage,
- Url = datdata.Url,
- Comment = datdata.Comment,
- Header = datdata.Header,
- Type = datdata.Type,
- ForceMerging = datdata.ForceMerging,
- ForceNodump = datdata.ForceNodump,
- ForcePacking = datdata.ForcePacking,
- OutputFormat = outputFormat,
- MergeRoms = datdata.MergeRoms,
- Roms = new Dictionary>(),
- };
-
- // Now populate each of the DAT objects in turn
- List keys = datdata.Roms.Keys.ToList();
- foreach (string key in keys)
- {
- List roms = datdata.Roms[key];
- foreach (RomData rom in roms)
- {
- // If the file is a nodump
- if (rom.Nodump)
- {
- if (nodump.Roms.ContainsKey(key))
- {
- nodump.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- nodump.Roms.Add(key, temp);
- }
- }
- // If the file has a SHA-1
- else if (rom.SHA1 != null && rom.SHA1 != "")
- {
- if (sha1.Roms.ContainsKey(key))
- {
- sha1.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- sha1.Roms.Add(key, temp);
- }
- }
- // If the file has no SHA-1 but has an MD5
- else if (rom.MD5 != null && rom.MD5 != "")
- {
- if (md5.Roms.ContainsKey(key))
- {
- md5.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- md5.Roms.Add(key, temp);
- }
- }
- // All other cases
- else
- {
- if (crc.Roms.ContainsKey(key))
- {
- crc.Roms[key].Add(rom);
- }
- else
- {
- List temp = new List();
- temp.Add(rom);
- crc.Roms.Add(key, temp);
- }
- }
- }
- }
-
- // Get the output directory
- string outdir = "";
- if (_outdir != "")
- {
- outdir = _outdir + Path.GetDirectoryName(filename).Remove(0, basepath.Length - 1);
- }
- else
- {
- outdir = Path.GetDirectoryName(filename);
- }
-
- // Now, output all of the files to the output directory
- _logger.User("DAT information created, outputting new files");
- bool success = true;
- if (nodump.Roms.Count > 0)
- {
- success &= Output.WriteDatfile(nodump, outdir, _logger);
- }
- if (sha1.Roms.Count > 0)
- {
- success &= Output.WriteDatfile(sha1, outdir, _logger);
- }
- if (md5.Roms.Count > 0)
- {
- success &= Output.WriteDatfile(md5, outdir, _logger);
- }
- if (crc.Roms.Count > 0)
- {
- success &= Output.WriteDatfile(crc, outdir, _logger);
- }
-
- return success;
- }
- }
-}
diff --git a/DATabase/Partials/DATabase_Inits.cs b/DATabase/Partials/DATabase_Inits.cs
index d90eb272..4df01e41 100644
--- a/DATabase/Partials/DATabase_Inits.cs
+++ b/DATabase/Partials/DATabase_Inits.cs
@@ -405,14 +405,25 @@ namespace SabreTools
///
/// Wrap splitting a DAT by 2 extensions
///
- /// Input file or folder to be split
+ /// Input files or folders to be split
/// First extension to split on
/// Second extension to split on
/// Output directory for the split files
- private static void InitExtSplit(string input, string exta, string extb, string outdir)
+ private static void InitExtSplit(List inputs, string exta, string extb, string outdir)
{
+ // Verify the input files
+ foreach (string input in inputs)
+ {
+ if (!File.Exists(input.Replace("\"", "")) && !Directory.Exists(input.Replace("\"", "")))
+ {
+ _logger.Error(input + " is not a valid file or folder!");
+ Console.WriteLine();
+ Build.Help();
+ return;
+ }
+ }
+
// Strip any quotations from the names
- input = input.Replace("\"", "");
exta = exta.Replace("\"", "");
extb = extb.Replace("\"", "");
outdir = outdir.Replace("\"", "");
@@ -421,21 +432,9 @@ namespace SabreTools
List extaList = exta.Split(',').ToList();
List extbList = extb.Split(',').ToList();
- if (input != "" && File.Exists(input))
- {
- if (exta == "" || extb == "")
- {
- _logger.Warning("Two extensions are needed to split a DAT!");
- return;
- }
- ExtSplit es = new ExtSplit(input, extaList, extbList, outdir, _logger);
- es.Split();
- return;
- }
- else
- {
- _logger.Log("I'm sorry but " + input + "doesn't exist!");
- }
+ Split es = new Split(inputs, extaList, extbList, outdir, _logger);
+ es.Process();
+ return;
}
///
@@ -461,8 +460,8 @@ namespace SabreTools
}
// If so, run the program
- HashSplit hs = new HashSplit(inputs, outdir, _logger);
- hs.Split();
+ Split hs = new Split(inputs, outdir, _logger);
+ hs.Process();
}
///
diff --git a/DATabase/Split.cs b/DATabase/Split.cs
new file mode 100644
index 00000000..17f604de
--- /dev/null
+++ b/DATabase/Split.cs
@@ -0,0 +1,464 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+using SabreTools.Helper;
+
+namespace SabreTools
+{
+ public class Split
+ {
+ // Instance variables
+ private bool _hash;
+ private List _extA;
+ private List _extB;
+ private List _inputs;
+ private string _outdir;
+ private static Logger _logger;
+
+ ///
+ /// Create a new Split object (extension split)
+ ///
+ /// Filename of the DAT to split
+ /// List of extensions to split on (first DAT)
+ /// List of extensions to split on (second DAT)
+ /// Logger object for console and file writing
+ public Split(List inputs, List extA, List extB, string outdir, Logger logger)
+ {
+ _hash = false;
+ _inputs = new List();
+ foreach (string s in inputs)
+ {
+ _inputs.Add(s.Replace("\"", ""));
+ }
+ _extA = new List();
+ foreach (string s in extA)
+ {
+ _extA.Add((s.StartsWith(".") ? s : "." + s).ToUpperInvariant());
+ }
+ _extB = new List();
+ foreach (string s in extB)
+ {
+ _extB.Add((s.StartsWith(".") ? s : "." + s).ToUpperInvariant());
+ }
+ _outdir = outdir.Replace("\"", "");
+ _logger = logger;
+ }
+
+ ///
+ /// Create a new Split object (hash split)
+ ///
+ /// Filename of the DAT to split
+ /// Logger object for console and file writing
+ public Split(List inputs, string outdir, Logger logger)
+ {
+ _hash = true;
+ _inputs = new List();
+ foreach (string s in inputs)
+ {
+ _inputs.Add(s.Replace("\"", ""));
+ }
+ _extA = new List();
+ _extB = new List();
+ _outdir = outdir.Replace("\"", "");
+ _logger = logger;
+ }
+
+ ///
+ /// Split a DAT based on filtering by 2 extensions
+ ///
+ /// True if DAT was split, false otherwise
+ public bool Process()
+ {
+ bool success = true;
+
+ // If it's empty, use the current folder
+ if (_outdir.Trim() == "")
+ {
+ _outdir = Environment.CurrentDirectory;
+ }
+
+ // If the output directory doesn't exist, create it
+ if (!Directory.Exists(_outdir))
+ {
+ Directory.CreateDirectory(_outdir);
+ }
+
+ // Loop over the inputs
+ foreach (string input in _inputs)
+ {
+ // If it's a file, run the proper split on the file
+ if (File.Exists(input))
+ {
+ if (_hash)
+ {
+ success &= SplitByHash(Path.GetFullPath(input), Path.GetDirectoryName(input));
+ }
+ else
+ {
+ success &= SplitByExt(Path.GetFullPath(input), Path.GetDirectoryName(input));
+ }
+ }
+ // If it's a directory, run the splits over the files within
+ else if (Directory.Exists(input))
+ {
+ foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories))
+ {
+ if (_hash)
+ {
+ success &= SplitByHash(Path.GetFullPath(file), (input.EndsWith(Path.DirectorySeparatorChar.ToString()) ? input : input + Path.DirectorySeparatorChar));
+ }
+ else
+ {
+ success &= SplitByExt(Path.GetFullPath(file), (input.EndsWith(Path.DirectorySeparatorChar.ToString()) ? input : input + Path.DirectorySeparatorChar));
+ }
+ }
+ }
+ // If file doesn't exist, error and return
+ else
+ {
+ _logger.Error("File or folder '" + input + "' doesn't exist");
+ return false;
+ }
+ }
+
+ return success;
+ }
+
+ ///
+ /// Split a DAT by best available hashes
+ ///
+ /// Name of the file to be split
+ /// Parent path for replacement
+ /// True if split succeeded, false otherwise
+ private bool SplitByHash(string filename, string basepath)
+ {
+ // Sanitize the basepath to be more predictable
+ basepath = (basepath.EndsWith(Path.DirectorySeparatorChar.ToString()) ? basepath : basepath + Path.DirectorySeparatorChar);
+
+ // Get the file data to be split
+ OutputFormat outputFormat = RomManipulation.GetOutputFormat(filename);
+ DatData datdata = new DatData();
+ datdata = RomManipulation.Parse(filename, 0, 0, datdata, _logger, true);
+
+ // Create each of the respective output DATs
+ _logger.User("Creating and populating new DATs");
+ DatData nodump = new DatData
+ {
+ FileName = datdata.FileName + " (Nodump)",
+ Name = datdata.Name + " (Nodump)",
+ Description = datdata.Description + " (Nodump)",
+ Category = datdata.Category,
+ Version = datdata.Version,
+ Date = datdata.Date,
+ Author = datdata.Author,
+ Email = datdata.Email,
+ Homepage = datdata.Homepage,
+ Url = datdata.Url,
+ Comment = datdata.Comment,
+ Header = datdata.Header,
+ Type = datdata.Type,
+ ForceMerging = datdata.ForceMerging,
+ ForceNodump = datdata.ForceNodump,
+ ForcePacking = datdata.ForcePacking,
+ OutputFormat = outputFormat,
+ MergeRoms = datdata.MergeRoms,
+ Roms = new Dictionary>(),
+ };
+ DatData sha1 = new DatData
+ {
+ FileName = datdata.FileName + " (SHA-1)",
+ Name = datdata.Name + " (SHA-1)",
+ Description = datdata.Description + " (SHA-1)",
+ Category = datdata.Category,
+ Version = datdata.Version,
+ Date = datdata.Date,
+ Author = datdata.Author,
+ Email = datdata.Email,
+ Homepage = datdata.Homepage,
+ Url = datdata.Url,
+ Comment = datdata.Comment,
+ Header = datdata.Header,
+ Type = datdata.Type,
+ ForceMerging = datdata.ForceMerging,
+ ForceNodump = datdata.ForceNodump,
+ ForcePacking = datdata.ForcePacking,
+ OutputFormat = outputFormat,
+ MergeRoms = datdata.MergeRoms,
+ Roms = new Dictionary>(),
+ };
+ DatData md5 = new DatData
+ {
+ FileName = datdata.FileName + " (MD5)",
+ Name = datdata.Name + " (MD5)",
+ Description = datdata.Description + " (MD5)",
+ Category = datdata.Category,
+ Version = datdata.Version,
+ Date = datdata.Date,
+ Author = datdata.Author,
+ Email = datdata.Email,
+ Homepage = datdata.Homepage,
+ Url = datdata.Url,
+ Comment = datdata.Comment,
+ Header = datdata.Header,
+ Type = datdata.Type,
+ ForceMerging = datdata.ForceMerging,
+ ForceNodump = datdata.ForceNodump,
+ ForcePacking = datdata.ForcePacking,
+ OutputFormat = outputFormat,
+ MergeRoms = datdata.MergeRoms,
+ Roms = new Dictionary>(),
+ };
+ DatData crc = new DatData
+ {
+ FileName = datdata.FileName + " (CRC)",
+ Name = datdata.Name + " (CRC)",
+ Description = datdata.Description + " (CRC)",
+ Category = datdata.Category,
+ Version = datdata.Version,
+ Date = datdata.Date,
+ Author = datdata.Author,
+ Email = datdata.Email,
+ Homepage = datdata.Homepage,
+ Url = datdata.Url,
+ Comment = datdata.Comment,
+ Header = datdata.Header,
+ Type = datdata.Type,
+ ForceMerging = datdata.ForceMerging,
+ ForceNodump = datdata.ForceNodump,
+ ForcePacking = datdata.ForcePacking,
+ OutputFormat = outputFormat,
+ MergeRoms = datdata.MergeRoms,
+ Roms = new Dictionary>(),
+ };
+
+ // Now populate each of the DAT objects in turn
+ List keys = datdata.Roms.Keys.ToList();
+ foreach (string key in keys)
+ {
+ List roms = datdata.Roms[key];
+ foreach (RomData rom in roms)
+ {
+ // If the file is a nodump
+ if (rom.Nodump)
+ {
+ if (nodump.Roms.ContainsKey(key))
+ {
+ nodump.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ nodump.Roms.Add(key, temp);
+ }
+ }
+ // If the file has a SHA-1
+ else if (rom.SHA1 != null && rom.SHA1 != "")
+ {
+ if (sha1.Roms.ContainsKey(key))
+ {
+ sha1.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ sha1.Roms.Add(key, temp);
+ }
+ }
+ // If the file has no SHA-1 but has an MD5
+ else if (rom.MD5 != null && rom.MD5 != "")
+ {
+ if (md5.Roms.ContainsKey(key))
+ {
+ md5.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ md5.Roms.Add(key, temp);
+ }
+ }
+ // All other cases
+ else
+ {
+ if (crc.Roms.ContainsKey(key))
+ {
+ crc.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ crc.Roms.Add(key, temp);
+ }
+ }
+ }
+ }
+
+ // Get the output directory
+ string outdir = "";
+ if (_outdir != "")
+ {
+ outdir = _outdir + Path.GetDirectoryName(filename).Remove(0, basepath.Length - 1);
+ }
+ else
+ {
+ outdir = Path.GetDirectoryName(filename);
+ }
+
+ // Now, output all of the files to the output directory
+ _logger.User("DAT information created, outputting new files");
+ bool success = true;
+ if (nodump.Roms.Count > 0)
+ {
+ success &= Output.WriteDatfile(nodump, outdir, _logger);
+ }
+ if (sha1.Roms.Count > 0)
+ {
+ success &= Output.WriteDatfile(sha1, outdir, _logger);
+ }
+ if (md5.Roms.Count > 0)
+ {
+ success &= Output.WriteDatfile(md5, outdir, _logger);
+ }
+ if (crc.Roms.Count > 0)
+ {
+ success &= Output.WriteDatfile(crc, outdir, _logger);
+ }
+
+ return success;
+ }
+
+ ///
+ /// Split a DAT by input extensions
+ ///
+ /// Name of the file to be split
+ /// Parent path for replacement
+ /// True if split succeeded, false otherwise
+ private bool SplitByExt(string filename, string basepath)
+ {
+ // Load the current DAT to be processed
+ DatData datdata = new DatData();
+ datdata = RomManipulation.Parse(filename, 0, 0, datdata, _logger);
+
+ // Set all of the appropriate outputs for each of the subsets
+ OutputFormat outputFormat = RomManipulation.GetOutputFormat(filename);
+ DatData datdataA = new DatData
+ {
+ FileName = datdata.FileName + " (" + String.Join(",", _extA) + ")",
+ Name = datdata.Name + " (" + String.Join(",", _extA) + ")",
+ Description = datdata.Description + " (" + String.Join(",", _extA) + ")",
+ Category = datdata.Category,
+ Version = datdata.Version,
+ Date = datdata.Date,
+ Author = datdata.Author,
+ Email = datdata.Email,
+ Homepage = datdata.Homepage,
+ Url = datdata.Url,
+ Comment = datdata.Comment,
+ Roms = new Dictionary>(),
+ OutputFormat = outputFormat,
+ };
+ DatData datdataB = new DatData
+ {
+ FileName = datdata.FileName + " (" + String.Join(",", _extB) + ")",
+ Name = datdata.Name + " (" + String.Join(",", _extB) + ")",
+ Description = datdata.Description + " (" + String.Join(",", _extB) + ")",
+ Category = datdata.Category,
+ Version = datdata.Version,
+ Date = datdata.Date,
+ Author = datdata.Author,
+ Email = datdata.Email,
+ Homepage = datdata.Homepage,
+ Url = datdata.Url,
+ Comment = datdata.Comment,
+ Roms = new Dictionary>(),
+ OutputFormat = outputFormat,
+ };
+
+ // If roms is empty, return false
+ if (datdata.Roms.Count == 0)
+ {
+ return false;
+ }
+
+ // Now separate the roms accordingly
+ foreach (string key in datdata.Roms.Keys)
+ {
+ foreach (RomData rom in datdata.Roms[key])
+ {
+ if (_extA.Contains(Path.GetExtension(rom.Name.ToUpperInvariant())))
+ {
+ if (datdataA.Roms.ContainsKey(key))
+ {
+ datdataA.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ datdataA.Roms.Add(key, temp);
+ }
+ }
+ else if (_extB.Contains(Path.GetExtension(rom.Name.ToUpperInvariant())))
+ {
+ if (datdataB.Roms.ContainsKey(key))
+ {
+ datdataB.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ datdataB.Roms.Add(key, temp);
+ }
+ }
+ else
+ {
+ if (datdataA.Roms.ContainsKey(key))
+ {
+ datdataA.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ datdataA.Roms.Add(key, temp);
+ }
+ if (datdataB.Roms.ContainsKey(key))
+ {
+ datdataB.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ datdataB.Roms.Add(key, temp);
+ }
+ }
+ }
+ }
+
+ // Get the output directory
+ string outdir = "";
+ if (_outdir != "")
+ {
+ outdir = _outdir + Path.GetDirectoryName(filename).Remove(0, basepath.Length - 1);
+ }
+ else
+ {
+ outdir = Path.GetDirectoryName(filename);
+ }
+
+ // Then write out both files
+ bool success = Output.WriteDatfile(datdataA, outdir, _logger);
+ success &= Output.WriteDatfile(datdataB, outdir, _logger);
+
+ return success;
+ }
+ }
+}