/// <summary>
        /// Patch the current Database. Optionally save.
        /// </summary>
        /// <param name="saveFolder">The working directory of the Controller. Set to null for default handling.</param>
        /// <returns>The Generic Importer and the Controller.</returns>
        /// <exception cref="Exception">This method may throw based on the Initialisation method.</exception>
        public static void GenerateDatabasePatch(
            string patchFile,
            string?saveFolder = null)
        {
            Console.WriteLine($"GenerateDatabasePatch called with patchFile={patchFile}, saveFolder={saveFolder}...");

            if (saveFolder == null)
            {
                saveFolder = Directory.GetParent(patchFile).FullName;
            }

            try
            {
                WinApi.TryTimeBeginPeriod(1);
                Directory.CreateDirectory(saveFolder);

                // Load.
                SplatTagJsonSnapshotDatabase splatTagJsonSnapshotDatabase = new SplatTagJsonSnapshotDatabase(saveFolder);
                GenericFilesToIImporters     iImporters = new GenericFilesToIImporters(saveFolder, patchFile);
                MultiDatabase database = new MultiDatabase()
                                         .With(splatTagJsonSnapshotDatabase)
                                         .With(iImporters);

                SplatTagController splatTagController = new SplatTagController(database);
                splatTagController.Initialise();

                // Now that we've initialised, take a snapshot of everything.
                SaveDatabase(splatTagController, splatTagJsonSnapshotDatabase);
            }
            finally
            {
                WinApi.TryTimeEndPeriod(1);
            }
        }
        /// <summary>
        /// Generate a new Database. Optionally save.
        /// </summary>
        /// <param name="saveFolder">The working directory of the Controller. Set to null for default handling.</param>
        /// <returns>The Generic Importer and the Controller.</returns>
        /// <exception cref="Exception">This method may throw based on the Initialisation method.</exception>
        public static (GenericFilesToIImporters, SplatTagController) GenerateNewDatabase(
            string?saveFolder  = null,
            string?sourcesFile = null)
        {
            Console.WriteLine($"GenerateNewDatabase called with saveFolder={saveFolder}, sourcesFile={sourcesFile}...");

            if (sourcesFile == null)
            {
                sourcesFile = GenericFilesToIImporters.DefaultSourcesFileName;

                if (saveFolder == null)
                {
                    saveFolder = GetDefaultPath();
                }
            }
            else if (saveFolder == null)
            {
                saveFolder = Directory.GetParent(sourcesFile).FullName;
            }

            try
            {
                WinApi.TryTimeBeginPeriod(1);

                // Directories created in GenericFilesToIImporters
                GenericFilesToIImporters sourcesImporter    = new GenericFilesToIImporters(saveFolder, sourcesFile);
                MultiDatabase            splatTagDatabase   = new MultiDatabase().With(sourcesImporter);
                SplatTagController       splatTagController = new SplatTagController(splatTagDatabase);
                Console.WriteLine($"Full load of {sourcesImporter.Sources.Count} files from dir {Path.GetFullPath(saveFolder)}...");
                splatTagController.Initialise();

                // Now that we've initialised, take a snapshot of everything.
                SaveDatabase(splatTagController, saveFolder);
                return(sourcesImporter, splatTagController);
            }
            finally
            {
                WinApi.TryTimeEndPeriod(1);
            }
        }