Files
Rozpisky/Rozpisky/Data/UzivatelskaData.cs
T
marekandClaude Opus 5 3c0e30bf35 Uživatelská data do %APPDATA%\Rozpisky místo vedle .exe
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>
2026-09-07 10:39:25 +02:00

54 lines
2.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}