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) { }
}
}