using System.IO; namespace DeskCore; /// /// Übernimmt Daten früherer Namen dieser App ("DesktopSortierer", "DeskHub") einmalig nach "DeskCore". /// Darf Storage/AppSettings nicht anfassen – läuft, bevor deren Pfade festgelegt werden. /// public static class Migration { private const string NewName = "DeskCore"; /// Frühere Namen, neuester zuerst. private static readonly string[] LegacyNames = ["DeskHub", "DesktopSortierer"]; private static readonly Environment.SpecialFolder[] Folders = [ Environment.SpecialFolder.UserProfile, // Kategorien Environment.SpecialFolder.ApplicationData, // Einstellungen Environment.SpecialFolder.LocalApplicationData, // Zwischenablage für Rückgängig ]; public static void Run() { if (FindLegacy() is { } legacy) { foreach (var folder in Folders) { var baseDir = Environment.GetFolderPath(folder); var oldPath = Path.Combine(baseDir, legacy); var newPath = Path.Combine(baseDir, NewName); if (!Directory.Exists(oldPath) || Directory.Exists(newPath)) continue; try { Directory.Move(oldPath, newPath); } // gleiches Laufwerk → sofort, auch bei großen Ordnern catch { /* z. B. Ordner gerade im Explorer geöffnet → Pick() nimmt den alten weiter */ } } } Autostart.Migrate(); } /// /// Ältester noch vorhandener Datenbestand dieser App. "DeskHub" heißt auch ein anderes Programm – /// deshalb zählt ein Ordner nur, wenn dort unsere Einstellungsdatei liegt. /// private static string? FindLegacy() { var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (Directory.Exists(Path.Combine(appData, NewName))) return null; // schon umgezogen foreach (var name in LegacyNames) if (IsOurs(Path.Combine(appData, name))) return name; // Ganz alte Versionen hatten evtl. noch keine Einstellungsdatei – nur die Kategorien var profile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile); return Directory.Exists(Path.Combine(profile, "DesktopSortierer")) ? "DesktopSortierer" : null; } private static bool IsOurs(string settingsDir) { try { var file = Path.Combine(settingsDir, "settings.json"); if (!File.Exists(file)) return false; var json = File.ReadAllText(file); return json.Contains("\"CategoryOrder\"") && json.Contains("\"FencesEnabled\""); } catch { return false; } } /// Neuer Ordner – außer der Umzug hat nicht geklappt und nur der alte existiert. public static string Pick(Environment.SpecialFolder folder, params string[] sub) { var baseDir = Environment.GetFolderPath(folder); if (!Directory.Exists(Path.Combine(baseDir, NewName)) && FindLegacy() is { } legacy && Directory.Exists(Path.Combine(baseDir, legacy))) return Path.Combine([baseDir, legacy, .. sub]); return Path.Combine([baseDir, NewName, .. sub]); } }