mirror of
https://github.com/claunia/SabreTools.git
synced 2025-12-16 19:14:27 +00:00
[SimpleSort] Clean up Inplace code, add lengthy comment
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user