using System.IO; namespace Rozpisky.Data; /// /// Jednorázový přesun dat starších verzí, které zapisovaly vedle .exe, do uživatelské složky /// (). Bez toho by uživatel po aktualizaci našel prázdné číselníky /// a přenastavený CAD. Volá se jednou při startu, ještě než si na data sáhne kterýkoli store. /// /// Zásada: nikdy nic nemazat a nikdy nepřepsat novější data. Soubor se přenese jen tehdy, když /// v cíli ještě není; originál zůstane ležet jako *.migrovano (jediná kopie uživatelových dat). /// Selhání nesmí shodit start – horší než nepřenesená data je aplikace, která nenaběhne. /// /// public static class Migrace { /// Přípona, kterou dostane původní soubor po přenesení. public const string PriponaHotovo = ".migrovano"; /// Přenese cad.json a layout.json ze složky aplikace do uživatelské. /// Číselníky mají vlastní cestu (rozpad na vrstvy) – viz . public static void PrenesStaraData() { Prenes(CadEnginesStoreNazev); Prenes(LayoutConfigStoreNazev); } private const string CadEnginesStoreNazev = "cad.json"; private const string LayoutConfigStoreNazev = "layout.json"; /// Přesune soubor ze složky aplikace do uživatelské, pokud tam ještě není. /// V portable režimu jsou obě složky totožné a neudělá se nic. private static void Prenes(string nazevSouboru) { try { var zdroj = Path.Combine(AppContext.BaseDirectory, nazevSouboru); var cil = UzivatelskaData.Cesta(nazevSouboru); if (string.Equals(zdroj, cil, StringComparison.OrdinalIgnoreCase)) return; if (!File.Exists(zdroj) || File.Exists(cil)) return; File.Copy(zdroj, cil); OznacJakoPrenesene(zdroj); } catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) { // Nezapisovatelná instalační složka apod. – data zůstanou tam, kde jsou, a zkusí se // přenést zase příště. Start aplikace to zastavit nesmí. } } /// Přejmenuje původní soubor na *.migrovano, aby se přenos neopakoval a aby /// starší verze programu (kdyby ji uživatel vrátil) nezmátla už neaktuální data. Nedaří-li se /// to (soubor jen pro čtení), nevadí – kopie v cíli už existuje a další běh přenos přeskočí. internal static void OznacJakoPrenesene(string cesta) { try { File.Move(cesta, cesta + PriponaHotovo, overwrite: true); } catch (Exception ex) when (ex is IOException or UnauthorizedAccessException) { } } }