diff --git a/SabreTools.Helper/Tools/DatTools.cs b/SabreTools.Helper/Tools/DatTools.cs
index 152c630d..2364f14c 100644
--- a/SabreTools.Helper/Tools/DatTools.cs
+++ b/SabreTools.Helper/Tools/DatTools.cs
@@ -1418,7 +1418,7 @@ namespace SabreTools.Helper
foreach (Rom rom in roms)
{
count++;
- string newkey = (norename ? "" : rom.Metadata.SystemID.ToString().PadLeft(10, '0') + "-" + rom.Metadata.SourceID.ToString().PadLeft(10, '0') + "-") + rom.Game.ToLowerInvariant();
+ string newkey = (norename ? "" : rom.Metadata.SystemID.ToString().PadLeft(10, '0') + "-" + rom.Metadata.SourceID.ToString().PadLeft(10, '0') + "-") + (String.IsNullOrEmpty(rom.Game) ? "" : rom.Game.ToLowerInvariant());
if (sortable.ContainsKey(newkey))
{
sortable[newkey].Add(rom);
diff --git a/SabreTools/DATFromDir.cs b/SabreTools/DATFromDir.cs
index 07baef43..31fc6ebf 100644
--- a/SabreTools/DATFromDir.cs
+++ b/SabreTools/DATFromDir.cs
@@ -25,10 +25,17 @@ namespace SabreTools
private bool _bare;
private bool _archivesAsFiles;
private bool _enableGzip;
+ private bool _nowrite;
// Other required variables
private Logger _logger;
+ // Public variables
+ public Dat DatData
+ {
+ get { return _datdata; }
+ }
+
///
/// Create a new DATFromDir object
///
@@ -38,10 +45,11 @@ namespace SabreTools
/// True if SHA-1 hashes should be skipped over, false otherwise
/// True if the date should be omitted from the DAT, false otherwise
/// True if archives should be treated as files, false otherwise
- /// True if GZIP archives should be treated as files, false otherwise>
- /// Logger object for console and file output
+ /// True if GZIP archives should be treated as files, false otherwise
/// Name of the directory to create a temp folder in (blank is current directory)
- public DATFromDir(List inputs, Dat datdata, bool noMD5, bool noSHA1, bool bare, bool archivesAsFiles, bool enableGzip, string tempDir, Logger logger)
+ /// True if the file should not be written out, false otherwise (default)
+ /// Logger object for console and file output
+ public DATFromDir(List inputs, Dat datdata, bool noMD5, bool noSHA1, bool bare, bool archivesAsFiles, bool enableGzip, string tempDir, Logger logger, bool nowrite = false)
{
_inputs = inputs;
_datdata = datdata;
@@ -52,6 +60,7 @@ namespace SabreTools
_enableGzip = enableGzip;
_tempDir = tempDir;
_logger = logger;
+ _nowrite = nowrite;
}
///
@@ -98,10 +107,18 @@ namespace SabreTools
_datdata.Description = _datdata.Name + (_bare ? "" : " (" + _datdata.Date + ")");
}
- // Create and open the output file for writing
- FileStream fs = File.Create(Style.CreateOutfileName(Environment.CurrentDirectory, _datdata));
- StreamWriter sw = new StreamWriter(fs, Encoding.UTF8);
- sw.AutoFlush = true;
+ StreamWriter sw;
+ if (_nowrite)
+ {
+ sw = new StreamWriter(new MemoryStream());
+ }
+ else
+ {
+ // Create and open the output file for writing
+ FileStream fs = File.Create(Style.CreateOutfileName(Environment.CurrentDirectory, _datdata));
+ sw = new StreamWriter(fs, Encoding.UTF8);
+ sw.AutoFlush = true;
+ }
// Write out the initial file header
Output.WriteHeader(sw, _datdata, _logger);
@@ -227,8 +244,10 @@ namespace SabreTools
// Now output any empties to the stream (if not in Romba mode)
if (!_datdata.Romba)
{
- foreach (List roms in _datdata.Roms.Values)
+ List keys = _datdata.Roms.Keys.ToList();
+ foreach (string key in keys)
{
+ List roms = _datdata.Roms[key];
for (int i = 0; i < roms.Count; i++)
{
Rom rom = roms[i];
@@ -244,23 +263,40 @@ namespace SabreTools
rom.SHA1 = Constants.SHA1Zero;
}
- // If we have a different game and we're not at the start of the list, output the end of last item
- int last = 0;
- if (lastparent != null && lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ if (_nowrite)
{
- Output.WriteEndGame(sw, rom, new List(), new List(), lastparent, _datdata, 0, out last, _logger);
+ string inkey = rom.Size + "-" + rom.CRC;
+ if (_datdata.Roms.ContainsKey(inkey))
+ {
+ _datdata.Roms[inkey].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ _datdata.Roms.Add(inkey, temp);
+ }
}
-
- // If we have a new game, output the beginning of the new item
- if (lastparent == null || lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ else
{
- Output.WriteStartGame(sw, rom, new List(), lastparent, _datdata, 0, last, _logger);
- }
+ // If we have a different game and we're not at the start of the list, output the end of last item
+ int last = 0;
+ if (lastparent != null && lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ {
+ Output.WriteEndGame(sw, rom, new List(), new List(), lastparent, _datdata, 0, out last, _logger);
+ }
- // Write out the rom data
- if (_datdata.OutputFormat != OutputFormat.SabreDat && _datdata.OutputFormat != OutputFormat.MissFile)
- {
- Output.WriteRomData(sw, rom, lastparent, _datdata, 0, _logger);
+ // If we have a new game, output the beginning of the new item
+ if (lastparent == null || lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ {
+ Output.WriteStartGame(sw, rom, new List(), lastparent, _datdata, 0, last, _logger);
+ }
+
+ // Write out the rom data
+ if (_datdata.OutputFormat != OutputFormat.SabreDat && _datdata.OutputFormat != OutputFormat.MissFile)
+ {
+ Output.WriteRomData(sw, rom, lastparent, _datdata, 0, _logger);
+ }
}
lastparent = rom.Game;
@@ -304,9 +340,27 @@ namespace SabreTools
if (rom.Name != null)
{
int last = 0;
- Output.WriteStartGame(sw, rom, new List(), "", _datdata, 0, 0, _logger);
- Output.WriteRomData(sw, rom, "", _datdata, 0, _logger);
- Output.WriteEndGame(sw, rom, new List(), new List(), "", _datdata, 0, out last, _logger);
+
+ if (_nowrite)
+ {
+ string key = rom.Size + "-" + rom.CRC;
+ if (_datdata.Roms.ContainsKey(key))
+ {
+ _datdata.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ _datdata.Roms.Add(key, temp);
+ }
+ }
+ else
+ {
+ Output.WriteStartGame(sw, rom, new List(), "", _datdata, 0, 0, _logger);
+ Output.WriteRomData(sw, rom, "", _datdata, 0, _logger);
+ Output.WriteEndGame(sw, rom, new List(), new List(), "", _datdata, 0, out last, _logger);
+ }
}
else
{
@@ -357,10 +411,14 @@ namespace SabreTools
_logger.Log(Path.GetFileName(item) + " treated like an archive");
foreach (string entry in Directory.EnumerateFiles(tempdir, "*", SearchOption.AllDirectories))
{
+ string tempbasepath = (Path.GetDirectoryName(Path.GetFullPath(item)) + Path.DirectorySeparatorChar);
lastparent = ProcessFile(Path.GetFullPath(entry), sw, Path.GetFullPath(tempdir),
- Path.Combine((Path.GetDirectoryName(Path.GetFullPath(item)) + Path.DirectorySeparatorChar).Remove(0, _basePath.Length) +
- Path.GetFileNameWithoutExtension(item)
- ), _datdata, lastparent);
+ (String.IsNullOrEmpty(tempbasepath)
+ ? ""
+ : (tempbasepath.Length < _basePath.Length
+ ? tempbasepath
+ : tempbasepath.Remove(0, _basePath.Length))) +
+ Path.GetFileNameWithoutExtension(item), _datdata, lastparent);
}
// Clear the temp directory
@@ -455,21 +513,38 @@ namespace SabreTools
rom.Game = rom.Game.Replace(Path.DirectorySeparatorChar.ToString() + Path.DirectorySeparatorChar.ToString(), Path.DirectorySeparatorChar.ToString());
rom.Name = actualitem;
- // If we have a different game and we're not at the start of the list, output the end of last item
- int last = 0;
- if (lastparent != null && lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ if (_nowrite)
{
- Output.WriteEndGame(sw, rom, new List(), new List(), lastparent, datdata, 0, out last, _logger);
+ string key = rom.Size + "-" + rom.CRC;
+ if (_datdata.Roms.ContainsKey(key))
+ {
+ _datdata.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ _datdata.Roms.Add(key, temp);
+ }
}
-
- // If we have a new game, output the beginning of the new item
- if (lastparent == null || lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ else
{
- Output.WriteStartGame(sw, rom, new List(), lastparent, datdata, 0, last, _logger);
- }
+ // If we have a different game and we're not at the start of the list, output the end of last item
+ int last = 0;
+ if (lastparent != null && lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ {
+ Output.WriteEndGame(sw, rom, new List(), new List(), lastparent, datdata, 0, out last, _logger);
+ }
- // Write out the rom data
- Output.WriteRomData(sw, rom, lastparent, datdata, 0, _logger);
+ // If we have a new game, output the beginning of the new item
+ if (lastparent == null || lastparent.ToLowerInvariant() != rom.Game.ToLowerInvariant())
+ {
+ Output.WriteStartGame(sw, rom, new List(), lastparent, datdata, 0, last, _logger);
+ }
+
+ // Write out the rom data
+ Output.WriteRomData(sw, rom, lastparent, datdata, 0, _logger);
+ }
_logger.User("File added: " + actualitem + Environment.NewLine);
return rom.Game;
diff --git a/SimpleSort/SimpleSort.cs b/SimpleSort/SimpleSort.cs
index ae16e54f..95143ecb 100644
--- a/SimpleSort/SimpleSort.cs
+++ b/SimpleSort/SimpleSort.cs
@@ -270,21 +270,19 @@ namespace SabreTools
Dat datdata = new Dat();
foreach (string datfile in datfiles)
{
- datdata = DatTools.Parse(datfile, 0, 0, datdata, logger);
+ datdata = DatTools.Parse(datfile, 99, 99, datdata, logger);
}
SimpleSort ss = new SimpleSort(datdata, inputs, outdir, tempdir, quickScan, toFolder, verify, sevenzip, gz, rar, zip, logger);
- ss.RebuildToOutput();
+ ss.StartProcessing();
}
///
- /// Process the DAT and find all matches in input files and folders
+ /// Pick the appropriate action based on the inputs
///
- /// True if rebuilding was a success, false otherwise
- public bool RebuildToOutput()
+ /// True if success, false otherwise
+ public bool StartProcessing()
{
- bool success = true;
-
// First, check that the output directory exists
if (!Directory.Exists(_outdir))
{
@@ -302,79 +300,152 @@ namespace SabreTools
Output.CleanDirectory(_tempdir);
}
- // If we're in verification mode, only check the output directory
if (_verify)
{
- // Create a list of files from the output directory
- List files = new List();
- foreach (string file in Directory.EnumerateFiles(_outdir, "*", SearchOption.AllDirectories))
+ return VerifyDirectory();
+ }
+ else
+ {
+ return RebuildToOutput();
+ }
+ }
+
+ ///
+ /// Process the DAT and verify the output directory
+ ///
+ /// True if verification was a success, false otherwise
+ public bool VerifyDirectory()
+ {
+ bool success = true;
+
+ // Enumerate all files from the output directory
+ List files = new List();
+ foreach (string file in Directory.EnumerateFiles(_outdir, "*", SearchOption.AllDirectories))
+ {
+ _logger.Log("File found: '" + file + "'");
+ files.Add(Path.GetFullPath(file));
+ }
+
+ /*
+ We want the cross section of what's the folder and what's in the DAT. Right now, it just has what's in the DAT that's not in the folder
+ */
+
+ // Then, loop through and check each of the inputs
+ _logger.User("Processing files:\n");
+ DATFromDir dfd = new DATFromDir(files, _datdata, false, false, false, false, true, "", _logger, true);
+ dfd.Start();
+
+ // Setup the fixdat
+ _matched = (Dat)_datdata.CloneHeader();
+ _matched.Roms = new Dictionary>();
+ _matched.FileName = "fixDat_" + _matched.FileName;
+ _matched.Name = "fixDat_" + _matched.Name;
+ _matched.Description = "fixDat_" + _matched.Description;
+ _matched.OutputFormat = OutputFormat.Xml;
+
+ // Now that all files are parsed, get only files found in directory
+ bool found = false;
+ foreach (List roms in _datdata.Roms.Values)
+ {
+ List newroms = RomTools.Merge(roms, _logger);
+ foreach (Rom rom in newroms)
{
- _logger.Log("File found: '" + file + "'");
- files.Add(Path.GetFullPath(file));
+ if (rom.Metadata.SourceID == 99)
+ {
+ found = true;
+ string key = rom.Size + "-" + rom.CRC;
+ if (_matched.Roms.ContainsKey(key))
+ {
+ _matched.Roms[key].Add(rom);
+ }
+ else
+ {
+ List temp = new List();
+ temp.Add(rom);
+ _matched.Roms.Add(key, temp);
+ }
+ }
}
}
- // Otherwise, run the rebuilder
+ // Now output the fixdat to the main folder
+ if (found)
+ {
+ Output.WriteDatfile(_matched, "", _logger, stats: true);
+ }
else
{
- // Create a list of just files from inputs
- List files = new List();
- foreach (string input in _inputs)
- {
- if (File.Exists(input))
- {
- _logger.Log("File found: '" + input + "'");
- files.Add(Path.GetFullPath(input));
- }
- else if (Directory.Exists(input))
- {
- _logger.Log("Directory found: '" + input + "'");
- foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories))
- {
- _logger.Log("File found: '" + file + "'");
- files.Add(Path.GetFullPath(file));
- }
- }
- else
- {
- _logger.Error("'" + input + "' is not a file or directory!");
- }
- }
-
- // Then, loop through and check each of the inputs
- _logger.User("Processing files:\n");
- _cursorTop = Console.CursorTop;
- for (int i = 0; i < files.Count; i++)
- {
- success &= RebuildToOutputHelper(files[i], i, files.Count);
- Output.CleanDirectory(_tempdir);
- }
-
- // Now one final delete of the temp directory
- while (Directory.Exists(_tempdir))
- {
- try
- {
- Directory.Delete(_tempdir, true);
- }
- catch
- {
- continue;
- }
- }
-
- // Now output the stats for the built files
- _logger.ClearBeneath(Constants.HeaderHeight);
- Console.SetCursorPosition(0, Constants.HeaderHeight + 1);
- _logger.User("Stats of the matched ROMs:");
- Stats.OutputStats(_matched, _logger, true);
+ _logger.User("No fixDat needed");
}
return success;
}
///
- /// Process an individual file against the DAT
+ /// Process the DAT and find all matches in input files and folders
+ ///
+ /// True if rebuilding was a success, false otherwise
+ public bool RebuildToOutput()
+ {
+ bool success = true;
+
+ // Create a list of just files from inputs
+ List files = new List();
+ foreach (string input in _inputs)
+ {
+ if (File.Exists(input))
+ {
+ _logger.Log("File found: '" + input + "'");
+ files.Add(Path.GetFullPath(input));
+ }
+ else if (Directory.Exists(input))
+ {
+ _logger.Log("Directory found: '" + input + "'");
+ foreach (string file in Directory.EnumerateFiles(input, "*", SearchOption.AllDirectories))
+ {
+ _logger.Log("File found: '" + file + "'");
+ files.Add(Path.GetFullPath(file));
+ }
+ }
+ else
+ {
+ _logger.Error("'" + input + "' is not a file or directory!");
+ }
+ }
+
+ // Then, loop through and check each of the inputs
+ _logger.User("Processing files:\n");
+ _cursorTop = Console.CursorTop;
+ for (int i = 0; i < files.Count; i++)
+ {
+ success &= RebuildToOutputHelper(files[i], i, files.Count);
+ Output.CleanDirectory(_tempdir);
+ }
+
+ // Now one final delete of the temp directory
+ while (Directory.Exists(_tempdir))
+ {
+ try
+ {
+ Directory.Delete(_tempdir, true);
+ }
+ catch
+ {
+ continue;
+ }
+ }
+
+ // Now output the stats for the built files
+ _logger.ClearBeneath(Constants.HeaderHeight);
+ Console.SetCursorPosition(0, Constants.HeaderHeight + 1);
+ _logger.User("Stats of the matched ROMs:");
+ Stats.OutputStats(_matched, _logger, true);
+
+ return success;
+ }
+
+ ///
+ /// Process an individual file against the DAT for rebuilding
///
/// Name of the input file
/// Index of the current file
diff --git a/SimpleSort/SimpleSort.csproj b/SimpleSort/SimpleSort.csproj
index ba55fdda..ea0aaf7c 100644
--- a/SimpleSort/SimpleSort.csproj
+++ b/SimpleSort/SimpleSort.csproj
@@ -79,6 +79,10 @@
{225a1afd-0890-44e8-b779-7502665c23a5}
SabreTools.Helper
+
+ {3b615702-1866-4d7b-8af1-7b43fd0cc1d0}
+ SabreTools
+