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]);
}
}