diff --git a/SabreTools.DatFiles/Formats/Missfile.Reader.cs b/SabreTools.DatFiles/Formats/Missfile.Reader.cs
new file mode 100644
index 00000000..fa12a0bf
--- /dev/null
+++ b/SabreTools.DatFiles/Formats/Missfile.Reader.cs
@@ -0,0 +1,17 @@
+using System;
+
+namespace SabreTools.DatFiles.Formats
+{
+ ///
+ /// Represents parsing a Missfile
+ ///
+ internal partial class Missfile : DatFile
+ {
+ ///
+ /// There is no consistent way to parse a missfile
+ public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
+ {
+ throw new NotImplementedException();
+ }
+ }
+}
diff --git a/SabreTools.DatFiles/Formats/Missfile.Writer.cs b/SabreTools.DatFiles/Formats/Missfile.Writer.cs
new file mode 100644
index 00000000..da2cde2a
--- /dev/null
+++ b/SabreTools.DatFiles/Formats/Missfile.Writer.cs
@@ -0,0 +1,103 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using SabreTools.Core;
+using SabreTools.DatItems;
+
+namespace SabreTools.DatFiles.Formats
+{
+ ///
+ /// Represents writing a Missfile
+ ///
+ internal partial class Missfile : DatFile
+ {
+ ///
+ protected override List GetMissingRequiredFields(DatItem datItem)
+ {
+ // TODO: Check required fields
+ return null;
+ }
+
+ ///
+ 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;
+ }
+
+ StreamWriter sw = new(fs, new UTF8Encoding(false));
+
+ // 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 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 using machine names or we're not ignoring
+ if (!Header.UseRomName || !ShouldIgnore(datItem, ignoreblanks))
+ WriteDatItem(sw, datItem, lastgame);
+
+ // Set the new data to compare against
+ lastgame = datItem.Machine.Name;
+ }
+ }
+
+ logger.User($"'{outfile}' written!{Environment.NewLine}");
+ sw.Dispose();
+ fs.Dispose();
+ }
+ catch (Exception ex) when (!throwOnError)
+ {
+ logger.Error(ex);
+ return false;
+ }
+
+ return true;
+ }
+
+ ///
+ /// Write out DatItem using the supplied StreamWriter
+ ///
+ /// StreamWriter to output to
+ /// DatItem object to be output
+ /// The name of the last game to be output
+ private void WriteDatItem(StreamWriter sw, DatItem datItem, string lastgame)
+ {
+ // Process the item name
+ ProcessItemName(datItem, false, forceRomName: false);
+
+ // Romba mode automatically uses item name
+ if (Header.OutputDepot?.IsActive == true || Header.UseRomName)
+ sw.Write($"{datItem.GetName() ?? string.Empty}\n");
+ else if (!Header.UseRomName && datItem.Machine.Name != lastgame)
+ sw.Write($"{datItem.Machine.Name}\n");
+
+ sw.Flush();
+ }
+ }
+}
diff --git a/SabreTools.DatFiles/Formats/Missfile.cs b/SabreTools.DatFiles/Formats/Missfile.cs
index c33a4acb..1c38332c 100644
--- a/SabreTools.DatFiles/Formats/Missfile.cs
+++ b/SabreTools.DatFiles/Formats/Missfile.cs
@@ -1,16 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Text;
-using SabreTools.Core;
-using SabreTools.DatItems;
-
-namespace SabreTools.DatFiles.Formats
+namespace SabreTools.DatFiles.Formats
{
///
- /// Represents parsing and writing of a Missfile
+ /// Represents a Missfile
///
- internal class Missfile : DatFile
+ internal partial class Missfile : DatFile
{
///
/// Constructor designed for casting a base DatFile
@@ -20,100 +13,5 @@ namespace SabreTools.DatFiles.Formats
: base(datFile)
{
}
-
- ///
- public override void ParseFile(string filename, int indexId, bool keep, bool statsOnly = false, bool throwOnError = false)
- {
- // There is no consistent way to parse a missfile...
- throw new NotImplementedException();
- }
-
- ///
- protected override List GetMissingRequiredFields(DatItem datItem)
- {
- // TODO: Check required fields
- return null;
- }
-
- ///
- 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;
- }
-
- StreamWriter sw = new(fs, new UTF8Encoding(false));
-
- // 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 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 using machine names or we're not ignoring
- if (!Header.UseRomName || !ShouldIgnore(datItem, ignoreblanks))
- WriteDatItem(sw, datItem, lastgame);
-
- // Set the new data to compare against
- lastgame = datItem.Machine.Name;
- }
- }
-
- logger.User($"'{outfile}' written!{Environment.NewLine}");
- sw.Dispose();
- fs.Dispose();
- }
- catch (Exception ex) when (!throwOnError)
- {
- logger.Error(ex);
- return false;
- }
-
- return true;
- }
-
- ///
- /// Write out DatItem using the supplied StreamWriter
- ///
- /// StreamWriter to output to
- /// DatItem object to be output
- /// The name of the last game to be output
- private void WriteDatItem(StreamWriter sw, DatItem datItem, string lastgame)
- {
- // Process the item name
- ProcessItemName(datItem, false, forceRomName: false);
-
- // Romba mode automatically uses item name
- if (Header.OutputDepot?.IsActive == true || Header.UseRomName)
- sw.Write($"{datItem.GetName() ?? string.Empty}\n");
- else if (!Header.UseRomName && datItem.Machine.Name != lastgame)
- sw.Write($"{datItem.Machine.Name}\n");
-
- sw.Flush();
- }
}
}