/// <summary> /// Output duplicate item diff /// </summary> /// <param name="datFile">Current DatFile object to use for updating</param> /// <param name="inputs">List of inputs to write out from</param> public static DatFile DiffDuplicates(DatFile datFile, List <ParentablePath> inputs) { InternalStopwatch watch = new InternalStopwatch("Initializing duplicate DAT"); // Fill in any information not in the base DAT if (string.IsNullOrWhiteSpace(datFile.Header.FileName)) { datFile.Header.FileName = "All DATs"; } if (string.IsNullOrWhiteSpace(datFile.Header.Name)) { datFile.Header.Name = "datFile.All DATs"; } if (string.IsNullOrWhiteSpace(datFile.Header.Description)) { datFile.Header.Description = "datFile.All DATs"; } string post = " (Duplicates)"; DatFile dupeData = DatFile.Create(datFile.Header); dupeData.Header.FileName += post; dupeData.Header.Name += post; dupeData.Header.Description += post; dupeData.Items = new ItemDictionary(); watch.Stop(); // Now, loop through the dictionary and populate the correct DATs watch.Start("Populating duplicate DAT"); Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => { ConcurrentList <DatItem> items = DatItem.Merge(datFile.Items[key]); // If the rom list is empty or null, just skip it if (items == null || items.Count == 0) { return; } // Loop through and add the items correctly foreach (DatItem item in items) { if (item.DupeType.HasFlag(DupeType.External)) { DatItem newrom = item.Clone() as DatItem; newrom.Machine.Name += $" ({Path.GetFileNameWithoutExtension(inputs[item.Source.Index].CurrentPath)})"; dupeData.Items.Add(key, newrom); } } }); watch.Stop(); return(dupeData); }
/// <summary> /// Fill a DatFile with all items with a particular ItemType /// </summary> /// <param name="datFile">Current DatFile object to split</param> /// <param name="indexDat">DatFile to add found items to</param> /// <param name="itemType">ItemType to retrieve items for</param> /// <returns>DatFile containing all items with the ItemType/returns> private static void FillWithItemType(DatFile datFile, DatFile indexDat, ItemType itemType) { // Loop through and add the items for this index to the output Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => { ConcurrentList <DatItem> items = DatItem.Merge(datFile.Items[key]); // If the rom list is empty or null, just skip it if (items == null || items.Count == 0) { return; } foreach (DatItem item in items) { if (item.ItemType == itemType) { indexDat.Items.Add(key, item); } } }); }
/// <summary> /// Output non-cascading diffs /// </summary> /// <param name="datFile">Current DatFile object to use for updating</param> /// <param name="inputs">List of inputs to write out from</param> public static List <DatFile> DiffIndividuals(DatFile datFile, List <ParentablePath> inputs) { InternalStopwatch watch = new InternalStopwatch("Initializing all individual DATs"); // Fill in any information not in the base DAT if (string.IsNullOrWhiteSpace(datFile.Header.FileName)) { datFile.Header.FileName = "All DATs"; } if (string.IsNullOrWhiteSpace(datFile.Header.Name)) { datFile.Header.Name = "All DATs"; } if (string.IsNullOrWhiteSpace(datFile.Header.Description)) { datFile.Header.Description = "All DATs"; } // Loop through each of the inputs and get or create a new DatData object DatFile[] outDatsArray = new DatFile[inputs.Count]; Parallel.For(0, inputs.Count, Globals.ParallelOptions, j => { string innerpost = $" ({j} - {inputs[j].GetNormalizedFileName(true)} Only)"; DatFile diffData = DatFile.Create(datFile.Header); diffData.Header.FileName += innerpost; diffData.Header.Name += innerpost; diffData.Header.Description += innerpost; diffData.Items = new ItemDictionary(); outDatsArray[j] = diffData; }); // Create a list of DatData objects representing individual output files List <DatFile> outDats = outDatsArray.ToList(); watch.Stop(); // Now, loop through the dictionary and populate the correct DATs watch.Start("Populating all individual DATs"); Parallel.ForEach(datFile.Items.Keys, Globals.ParallelOptions, key => { ConcurrentList <DatItem> items = DatItem.Merge(datFile.Items[key]); // If the rom list is empty or null, just skip it if (items == null || items.Count == 0) { return; } // Loop through and add the items correctly foreach (DatItem item in items) { if (item.DupeType.HasFlag(DupeType.Internal) || item.DupeType == 0x00) { outDats[item.Source.Index].Items.Add(key, item); } } }); watch.Stop(); return(outDats.ToList()); }