Vše, co píše uživatel, míří přes novou třídu UzivatelskaData do profilu uživatele: cad.json, layout.json, error.log, tisk_diag.log. Dosud se zapisovalo vedle .exe, takže .exe v Program Files (složka jen pro čtení) nebo přeinstalace novou verzí uživatele o data připravily. Dodávané podklady (šablona, mustr, loga, mapovani.json) se dál čtou vedle .exe – ty se naopak při každé instalaci obnovují. Hranice mezi tím, co se instaluje, a tím, co patří uživateli, vede přesně tudy. Portable režim zůstává: soubor portable.txt vedle .exe vrátí staré chování (běh z USB, vývoj s jednou složkou). Migrace: Migrace.PrenesStaraData() při startu přenese cad.json a layout.json ze staré polohy, pokud v cíli ještě nejsou; originál označí příponou .migrovano. Nic se nemaže a nic novějšího se nepřepíše. Číselníky přijdou na řadu samostatně (rozpad na dodávanou a uživatelskou vrstvu). Build 0 chyb / 0 varování, 36 testů zelených. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
54 lines
2.3 KiB
C#
54 lines
2.3 KiB
C#
using System.IO;
|
||
|
||
namespace Rozpisky.Data;
|
||
|
||
/// <summary>
|
||
/// Jediné místo pro data, která píše <b>uživatel</b> (číselníky, výběr CADu, konfigurace layoutů,
|
||
/// logy). Leží v profilu uživatele (<c>%APPDATA%\Rozpisky</c>), ne vedle .exe – přeinstalace novou
|
||
/// verzí ani .exe v <c>Program Files</c> (jen pro čtení) je tak nemůžou zničit.
|
||
/// <para>
|
||
/// Podklady <b>dodávané</b> s programem (šablona, mustr, loga, výchozí číselníky, mapování) zůstávají
|
||
/// vedle .exe a čtou se přes <see cref="AppContext.BaseDirectory"/> – ty se naopak při každé instalaci
|
||
/// obnovují. Hranice mezi tím, co se instaluje, a tím, co patří uživateli, vede přesně tudy.
|
||
/// </para>
|
||
/// <para>
|
||
/// <b>Portable režim:</b> leží-li vedle .exe soubor <c>portable.txt</c>, vrátí se složka aplikace.
|
||
/// Slouží k běhu z USB a k vývoji, kdy je pohodlnější mít všechno v jedné složce s buildem.
|
||
/// </para>
|
||
/// </summary>
|
||
public static class UzivatelskaData
|
||
{
|
||
/// <summary>Značka portable režimu vedle .exe (obsah souboru se neřeší, stačí že existuje).</summary>
|
||
public const string PortableZnacka = "portable.txt";
|
||
|
||
private const string NazevSlozky = "Rozpisky";
|
||
|
||
private static string? _slozka;
|
||
|
||
/// <summary>Složka pro zapisovaná data. Počítá se jednou za běh a při prvním použití se vytvoří.
|
||
/// Když se vytvořit nepodaří (výjimečné – profil uživatele je zapisovatelný), spadne se zpátky
|
||
/// na složku aplikace, ať se program aspoň spustí.</summary>
|
||
public static string Slozka => _slozka ??= UrciSlozku();
|
||
|
||
/// <summary>Plná cesta k souboru se zapisovanými daty.</summary>
|
||
public static string Cesta(string nazevSouboru) => Path.Combine(Slozka, nazevSouboru);
|
||
|
||
private static string UrciSlozku()
|
||
{
|
||
var vedleExe = AppContext.BaseDirectory;
|
||
if (File.Exists(Path.Combine(vedleExe, PortableZnacka))) return vedleExe;
|
||
|
||
try
|
||
{
|
||
var slozka = Path.Combine(
|
||
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), NazevSlozky);
|
||
Directory.CreateDirectory(slozka);
|
||
return slozka;
|
||
}
|
||
catch (Exception ex) when (ex is IOException or UnauthorizedAccessException)
|
||
{
|
||
return vedleExe;
|
||
}
|
||
}
|
||
}
|