/// <summary> /// Create and open an output file for writing direct from a dictionary /// </summary> /// <param name="outfile">Name of the file to write to</param> /// <param name="ignoreblanks">True if blank roms should be skipped on output, false otherwise (default)</param> /// <param name="throwOnError">True if the error that is thrown should be thrown back to the caller, false otherwise</param> /// <returns>True if the DAT was written correctly, false otherwise</returns> public override bool WriteToFile(string outfile, bool ignoreblanks = false, bool throwOnError = false) { try { logger.User($"Opening file for writing: {outfile}"); FileStream fs = FileExtensions.TryCreate(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); } SeparatedValueWriter svw = new SeparatedValueWriter(fs, new UTF8Encoding(false)) { Quotes = true, Separator = this._delim, VerifyFieldCount = true }; // Write out the header WriteHeader(svw); // Use a sorted list of games to output foreach (string key in Items.SortedKeys) { List <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]; // Check for a "null" item datItem = ProcessNullifiedItem(datItem); // Write out the item if we're not ignoring if (!ShouldIgnore(datItem, ignoreblanks)) { WriteDatItem(svw, datItem); } } } logger.Verbose("File written!" + Environment.NewLine); svw.Dispose(); fs.Dispose(); } catch (Exception ex) { logger.Error(ex); if (throwOnError) { throw ex; } return(false); } return(true); }
/// <inheritdoc/> public override bool WriteToFile(string outfile, bool baddumpCol, bool nodumpCol, bool throwOnError = false) { InternalStopwatch watch = new InternalStopwatch($"Writing statistics to '{outfile}"); try { // Try to create the output file FileStream fs = File.Create(outfile); if (fs == null) { logger.Warning($"File '{outfile}' could not be created for writing! Please check to see if the file is writable"); return(false); } SeparatedValueWriter svw = new SeparatedValueWriter(fs, Encoding.UTF8) { Separator = _separator, Quotes = true, }; // Write out the header WriteHeader(svw, baddumpCol, nodumpCol); // Now process each of the statistics for (int i = 0; i < Statistics.Count; i++) { // Get the current statistic DatStatistics stat = Statistics[i]; // If we have a directory statistic if (stat.IsDirectory) { WriteIndividual(svw, stat, baddumpCol, nodumpCol); // If we have anything but the last value, write the separator if (i < Statistics.Count - 1) { WriteFooterSeparator(svw); } } // If we have a normal statistic else { WriteIndividual(svw, stat, baddumpCol, nodumpCol); } } svw.Dispose(); fs.Dispose(); } catch (Exception ex) when(!throwOnError) { logger.Error(ex); return(false); } finally { watch.Stop(); } return(true); }