[SimpleSort] Clean up Inplace code, add lengthy comment

This commit is contained in:
Matt Nadareski
2016-06-21 11:38:33 -07:00
parent 895bcdf62e
commit fa904ec35c

View File

@@ -508,9 +508,6 @@ namespace SabreTools
b - If a file is a match and rebuilt, remove it from the output folder b - If a file is a match and rebuilt, remove it from the output folder
*/ */
// Sort the input set(s) by game
SortedDictionary<string, List<Rom>> sortedByGame = DatTools.BucketByGame(_datdata.Roms, false, true, _logger);
// Assuming archived sets, move all toplevel folders to temp // Assuming archived sets, move all toplevel folders to temp
foreach (string directory in Directory.EnumerateDirectories(_outdir, "*", SearchOption.TopDirectoryOnly)) foreach (string directory in Directory.EnumerateDirectories(_outdir, "*", SearchOption.TopDirectoryOnly))
{ {
@@ -518,66 +515,106 @@ namespace SabreTools
} }
// Now process the inputs (assumed that it's archived sets as of right now // Now process the inputs (assumed that it's archived sets as of right now
Dictionary<string, List<Rom>> scanned = new Dictionary<string, List<Rom>>();
foreach (string archive in Directory.EnumerateFiles(_outdir, "*", SearchOption.AllDirectories)) foreach (string archive in Directory.EnumerateFiles(_outdir, "*", SearchOption.AllDirectories))
{ {
// If the name of the archive is not in the set exactly, move it to temp // If we are in quickscan, get the list of roms that way
if (!sortedByGame.ContainsKey(Path.GetFileNameWithoutExtension(archive))) List<Rom> roms = new List<Rom>();
if (_quickScan)
{ {
File.Move(archive, Path.Combine(_tempdir, archive)); roms = ArchiveTools.GetArchiveFileInfo(Path.GetFullPath(archive), _logger);
} }
// Otherwise, we check if it's an archive. If it's not, move it to temp // Otherwise, extract it and get info one by one
else if (ArchiveTools.GetCurrentArchiveType(Path.GetFullPath(archive), _logger) == null)
{
File.Move(Path.GetFullPath(archive), Path.Combine(_tempdir, archive));
}
// Finally, if it's an archive and exists properly, we check the insides
else else
{ {
List<Rom> roms = new List<Rom>(); string temparcdir = Path.Combine(_tempdir, Path.GetFileNameWithoutExtension(archive));
ArchiveTools.ExtractArchive(Path.GetFullPath(archive), temparcdir, _logger);
// If we are in quickscan, get the list of roms that way foreach (string tempfile in Directory.EnumerateFiles(temparcdir, "*", SearchOption.AllDirectories))
if (_quickScan)
{ {
roms = ArchiveTools.GetArchiveFileInfo(Path.GetFullPath(archive), _logger); roms.Add(RomTools.GetSingleFileInfo(Path.GetFullPath(tempfile)));
}
// Clear the temporary archive directory
Output.CleanDirectory(temparcdir);
}
// Then add each of the found files to the new dictionary
foreach (Rom rom in roms)
{
string key = rom.Size + "-" + rom.CRC;
if (scanned.ContainsKey(key))
{
scanned[key].Add(rom);
} }
// Otherwise, extract it and get info one by one
else else
{ {
string temparcdir = Path.Combine(_tempdir, Path.GetFileNameWithoutExtension(archive)); List<Rom> templist = new List<Rom>();
ArchiveTools.ExtractArchive(Path.GetFullPath(archive), temparcdir, _logger); templist.Add(rom);
foreach (string tempfile in Directory.EnumerateFiles(temparcdir, "*", SearchOption.AllDirectories)) scanned.Add(key, templist);
{
roms.Add(RomTools.GetSingleFileInfo(Path.GetFullPath(tempfile)));
}
// Clear the temporary archive directory
Output.CleanDirectory(temparcdir);
} }
}
}
// Here, we traverse the newly created list and see if any of the files are in the list corresponding to the game // If nothing was found, we that it was successful
/* if (scanned.Count == 0)
Now, how do we do this WITHOUT traversing the list a billion times? {
Does "contains" work in this situation? return success;
Which is better: traversing the "should have" list or the "do have" list? }
*/
List<Rom> fromDat = sortedByGame[Path.GetFileNameWithoutExtension(archive)]; // Now that we have all of the from DAT and from folder roms, we try to match them, removing the perfect matches
List<Rom> toRemove = new List<Rom>(); Dictionary<string, List<Rom>> remove = new Dictionary<string, List<Rom>>();
foreach (Rom rom in roms) foreach (string key in scanned.Keys)
{
// If the key doesn't even exist in the DAT, then mark the entire key for removal
if (!_datdata.Roms.ContainsKey(key))
{
if (remove.ContainsKey(key))
{ {
// If it's not in at all or needs renaming, mark for removal remove[key].AddRange(scanned[key]);
if (!fromDat.Contains(rom)) }
else
{
remove.Add(key, scanned[key]);
}
}
// Otherwise check each of the values individually
else
{
List<Rom> romsList = _datdata.Roms[key];
List<Rom> scannedList = scanned[key];
foreach (Rom rom in scannedList)
{
if (!romsList.Contains(rom))
{ {
toRemove.Add(rom); if (remove.ContainsKey(key))
} {
// Otherwise, we leave it be remove[key].Add(rom);
else }
{ else
{
List<Rom> templist = new List<Rom>();
templist.Add(rom);
remove.Add(key, templist);
}
} }
} }
} }
} }
// At this point, we have the complete list of files from the DAT, a complete
// list of files that were scanned from the archives, and a complete list of
// the files to be removed because they aren't matches. I think at this point,
// we need to see if any of the files in "removed" can be rebuilt to something
// that is missing. But we don't have a list of missings, so how do we get this
// set of roms? Missing would be (_datdata.Roms - matches) I think. So if we
// get this additional set, we then run it against the "removed" set and rebuild
// as we go based on what we can do. Here is where we need some smarts. If the
// game to rebuild from and to are the same, we want to copy within. You
// should create a new helper function that "renames" an entry within the same
// archive to help this along. Everything else rebuilding should be copied from
// archive to archive. Once remove has been traversed, we will extract and remove
// all of the files that have been found and put them in the temporary folder.
return success; return success;
} }
} }