/// <inheritdoc/> public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false) { try { logger.User($"Writing to '{outfile}'..."); FileStream fs = File.Create(outfile); // If we get back null for some reason, just log and return if (fs == null) { logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable"); return(false); } ClrMameProWriter cmpw = new ClrMameProWriter(fs, new UTF8Encoding(false)) { Quotes = Quotes }; // Write out the header WriteHeader(cmpw); // Write out each of the machines and roms string lastgame = null; // Use a sorted list of games to output foreach (string key in Items.SortedKeys) { ConcurrentList <DatItem> datItems = Items.FilteredItems(key); // If this machine doesn't contain any writable items, skip if (!ContainsWritable(datItems)) { continue; } // Resolve the names in the block datItems = DatItem.ResolveNames(datItems); for (int index = 0; index < datItems.Count; index++) { DatItem datItem = datItems[index]; // If we have a different game and we're not at the start of the list, output the end of last item if (lastgame != null && lastgame.ToLowerInvariant() != datItem.Machine.Name.ToLowerInvariant()) { WriteEndGame(cmpw, datItem); } // If we have a new game, output the beginning of the new item if (lastgame == null || lastgame.ToLowerInvariant() != datItem.Machine.Name.ToLowerInvariant()) { WriteStartGame(cmpw, datItem); } // Check for a "null" item datItem = ProcessNullifiedItem(datItem); // Write out the item if we're not ignoring if (!ShouldIgnore(datItem, ignoreblanks)) { WriteDatItem(cmpw, datItem); } // Set the new data to compare against lastgame = datItem.Machine.Name; } } // Write the file footer out WriteFooter(cmpw); logger.User($"'{outfile}' written!{Environment.NewLine}"); cmpw.Dispose(); fs.Dispose(); } catch (Exception ex) when(!throwOnError) { logger.Error(ex); return(false); } return(true); }