2. díl - Úvod do práce se soubory

C# .NET Práce se soubory Úvod do práce se soubory

V minulém dílu našeho seriálu tutoriálů o C# jsme si vysvětlili výjimky, které k práci se soubory nutně potřebujeme, protože díky nim můžeme reagovat na případné chyby. Dnes si povíme něco o souborech obecně a o právech k zápisu v systémech Windows. Po dočtení tohoto tutoriálu budete připraveni se soubory pracovat.

Data, resp. objekty uložené v paměti, se samozřejmě s vypnutím aplikace ztratí. Pokud chceme zajistit, aby data byla tzv. perzistentní (trvalá), musíme je při ukončení programu uložit a při načtení programu opět načíst. K ukládání dat aplikace existuje mnoho způsobů, každý má nějaké výhody a nevýhody. Obecně můžeme ukládat data naší aplikace následujícím způsobem:

  • Textové soubory s jednoduchou strukturou (např. .txt a .csv)
  • textové soubory s vnitřní hierarchií (např. .xml nebo .json)
  • Soubory binárního typu (jednoduše otisk paměti do souboru)
  • Databáze

Každý způsob uložení dat má své výhody a nevýhody. My si jednotlivé způsoby v seriálu podrobně popíšeme a hlavně vyzkoušíme. Zaměříme se zejména na to, jak do souborů ukládat objekty a poté je znovu načítat. Databázím se poté věnuje samostatná sekce.

Práva k zápisu v systémech Windows

Windows 7 zápisová práva UAC

Od Windows Vista existuje v systémech Windows tzv. UAC (User Account Control). Technologie zakazuje zápis na systémový oddíl disku (nejčastěji C:) v případě, že zápis není povolen administrátorem nebo že se nejedná o zápis do osobních složek uživatele. Toto opatření samozřejmě naplnilo diskuzní fóra o programování a rozbilo řadu aplikací. Důležité však je, že toto opatření je správné a pouze zabraňuje špatně napsaným aplikacím měnit co se jim zlíbí. Linuxové systémy mají podobná opatření již dlouhou dobu.

Koncepce systému Windows zahrnuje uživatelské účty. Každý uživatelský účet je realizován složkou (většinou C:\users\jmeno_u­zivatele). Tato složka obsahuje mimo jiné dokumenty, pracovní plochu a také tzv. složku s daty aplikací. K této složce se lze dostat při zadání klíče %appdata% do cesty. Zkuste si %appdata% napsat do cesty průzkumníka a složku otevřít. Uvidíte, že ve složce má své podsložky mnoho aplikací, které máte nainstalovány. Právě zde je místo pro nastavení vašich aplikací a další data. Vaše aplikace si zde samozřejmě vytvoří složku se svým jménem a do té si bude vše ukládat. Nebudeme omezováni UAC a zároveň bude naše aplikace umožňovat jiné nastavení pro různé uživatele, aniž bychom to v C# programovali. %appdata% míří vždy k appdata aktuálně přihlášeného uživatele.

Velkou chybou bylo, že si programy ukládaly data do složky s programem. Program na ploše nebo na starých Windows fungoval, nicméně když se poté nainstaloval do složky program files na disku C, spadl s chybou při zápisu na disk. Windows tento zápis částečně pro určité aplikace emulovala, ale tím se nebudeme zabývat. Problém lze samozřejmě obejít tím, že aplikaci spustíme jako správce, ale to je špatné řešení.

V tomto tutoriálu si ukážeme, jak vytvořit v appdata složku pro naši aplikaci. V dalších tutoriálech již v kódu tato logika nebude obsažena a budou sloužit jako co nejjednodušší ukázka práce se soubory. Pokud budete aplikaci provozovat na svém počítači, nemusíte se o nic starat. Jakmile ji však budete publikovat, je vhodné ji upravit tak, aby appdata používala. Již tedy víme, kam budeme zapisovat. Výjimky jsme si uvedli také. Přesuňme se tedy k samotné práci se soubory.

IO a stream

V .NET existuje tzv. stream, což je obecný "datový proud". Na proud se napojíme a můžeme z něj poté načítat data nebo do něj data naopak zapisovat. Proud je teoreticky univerzální a ten samý proud se může necházet v paměti RAM nebo v souboru na disku. Práce se soubory je tedy realizována právě přes stream a všechny třídy, které si v budoucnu uvedeme, stream nějakým způsobem obalují nebo s ním pracují. My jsme od něj však odstíněni. Pro práci se soubory musíme do programu vložit odkaz na přislušný jmenný prostor, ve kterém se logika nachází:

using System.IO;

V této sekci se budeme v každém tutoriálu zabývat jedním typem souboru a ukážeme si vždy tu třídu, která je k tomu uzpůsobena. Nyní si ukažme naprostý základ toho, jak vytvořit pro naši aplikaci složku v appdata aktuálního uživatele. Budeme k tomu používat třídu Directory, které obsahuje statické metody pro práci se složkami. Dále se podíváme i na třídu File. Tak můžeme data (např. soubor nastaveni.dat) vytvořit s výchozími hodnotami nebo je načíst. Pro práci s cestou použijeme třídu Path. Všechny tři třídy budou podrobně vysvětleny v samostatném tutoriálu, nyní si ukážeme jen to nezbytné. Pojďme tedy napsat aplikaci, která bude mít vlastní složku v AppData a podívá se, jestli existuje její soubor databaze.dat. Nezapomeňte přidat using System.IO.

string cesta = "";
try
{
        cesta = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DevbookTutorial");
        if (!Directory.Exists(cesta))
                Directory.CreateDirectory(cesta);
}
catch
{
        Console.WriteLine("Nepodařilo se vytvořit složku {0}, zkontrolujte prosím svá oprávnění.", cesta);
}
if (File.Exists(Path.Combine(cesta, "databaze.dat")))
{
        try
        {
                // Zde umístěte kód pro načtení vašeho nastavení ze souboru
        }
        catch (Exception e)
        {
                Console.WriteLine("Při načítání nastavení došlo k následující chybě: {0}", e.Message);
        }
}
else
{
        try
        {
                // Zde umístěte kód pro vytvoření vašeho nastavení ze souboru
        }
        catch (Exception e)
        {
                Console.WriteLine("Při vytvoření nastavení došlo k následující chybě: {0}", e.Message);
        }
}

Nejprve si uložíme cestu ke složce s naší aplikací do textového řetězce cesta. Lokaci appdata získáme pomocí:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

Tak trochu bych očekával, že místo tohoto půjde napsat pouze "%appdata%", ale bohužel C# zkratku na cestu nepřevede. GetFolderPath nám tedy vrátí něco takového (Pro Windows 7):

C:\Users\vase_jmeno\AppData\Roaming

Do cesty přidáme ještě složku se jménem naší aplikace. Jméno jsem zvolil DevbookTutorial, samozřejmě si ho poté upravte. Abychom nemuseli přemýšlet, zda cesty obsahují na konci lomeno nebo jestli má být lomeno zpětné nebo obyčejné, spojíme cestu pomocí statické metody Combine na třídě Path. V cesta je tedy nyní toto:

C:\Users\vase_jmeno\AppData\Roaming\DevbookTutorial

Pokud daná složka neexistuje (jedná se o první spuštění aplikace), tak ji vytvoříme. Dále se podíváme, zda existuje soubor, ze kterého chceme data načítat. Pokud ano, provedeme načtení dat. Pokud ne, soubor vytvoříme a nahrajeme do něj výchozí data. Nebo soubor vytvářet ani nebudeme, záleží na typu aplikace.

Po spuštění kódu se nám ve složce %appdata% objeví nová složka:

Appdata a tvoření složky aplikace v C# .NET

Máme tedy rychlý úvod, jak správně ukládat data aplikace. O výjimkách jsme si také řekli. Nic nám již nebrání, abychom si příště ukázali práci s prvním formátem souborů, budou to textové soubory. Ještě raději zopakuji, že v následujících tutoriálech kvůli jednoduchost nebudu řešit zápisová práva a programy budou fungovat jen v dokumentech Visual Studia. Vždy se tedy vraťte sem a kód si upravte, pokud hotovou aplikaci budete chtít šířit.


 

Stáhnout

Staženo 692x (24.7 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

  Aktivity (1)

Článek pro vás napsal David Čápka
Avatar
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.

Jak se ti líbí článek?
Celkem (6 hlasů) :
4.833334.833334.833334.833334.83333


 


Miniatura
Předchozí článek
Výjimky
Miniatura
Všechny články v sekci
Práce se soubory v C#
Miniatura
Následující článek
Práce s textovými soubory v C#

 

 

Komentáře
Zobrazit starší komentáře (16)

Avatar
pracansky
Člen
Avatar
pracansky:

%appdata% je cesta do profilu jednoho uživatele ale co když potřebuji uložit nastavení které je společné pro všechny?

Jsou tam je složky jako "All Users","Default User","Default"...
Nerudovská otázka kam s ním?

 
Odpovědět 12.4.2015 17:07
Avatar
blazoid
Člen
Avatar
blazoid:

Ahoj, mám potíže se třídou "Directory" - když začnu psát Directory, našeptávač mně to nabídne, ovšem jakmile začnu psát tečku a Exists, začne to řvát, že typ "Exists" není ve jmenném prostoru Directory - absolutně se mi tedy nedaří vytvořit:

if (!Directory.E­xists(cesta))
Directory.Cre­ateDirectory(ces­ta);

 
Odpovědět 30.10.2015 20:26
Avatar
Richard H.
Redaktor
Avatar
Odpovídá na blazoid
Richard H.:

Zkus ignorovat ide a pokus se to zkompilovat pak uvidíš jesli je chyba u tebe nebo u ide.

Odpovědět 30.10.2015 21:53
Malý užitečný manuál je vždy lepší než bichle k ničemu.
Avatar
blazoid
Člen
Avatar
Odpovídá na Richard H.
blazoid:

Bohužel to při kompilaci vypíše následující:

Error 1 'bool' does not contain a definition for 'Exists' and no extension method 'Exists' accepting a first argument of type 'bool' could be found (are you missing a using directive or an assembly reference?) C:\BLAZEK\C#\Di­rectory\Direc­tory\Directory\Pro­gram.cs 23 32 Directory

Error 2 'bool' does not contain a definition for 'CreateDirectory' and no extension method 'CreateDirectory' accepting a first argument of type 'bool' could be found (are you missing a using directive or an assembly reference?) C:\BLAZEK\C#\Di­rectory\Direc­tory\Directory\Pro­gram.cs 24 31 Directory

  • následně mně to nabídne, zda chci spustit poslední verzi (tedy tu co se naposledy podařilo zkompilovat)...
 
Odpovědět 31.10.2015 17:08
Avatar
blazoid
Člen
Avatar
Odpovídá na blazoid
blazoid:

Ještě malá poznámka - když jsem si stáhl projekt z těchto stránek, normálně to fungovalo...

 
Odpovědět 31.10.2015 18:32
Avatar
Richard H.
Redaktor
Avatar
Odpovídá na blazoid
Richard H.:

To je mi ale záhada..nevidím tam žádnou syntaktickou chybu v C# nepracuje nějak moc ale tohle je fakt divné.

Odpovědět 31.10.2015 20:54
Malý užitečný manuál je vždy lepší než bichle k ničemu.
Avatar
Milan Křepelka
Redaktor
Avatar
Odpovídá na blazoid
Milan Křepelka:

Probém bude v mixování názvů namespaců. Ty máš název programu Directory, tedy i název namespacu bude Directory. A používáš Directory.Create.. . Když tam dáš celý název System.IO.Direc­tory.Create..­., tak to bude v pořádku.

 
Odpovědět  +2 31.10.2015 21:40
Avatar
blazoid
Člen
Avatar
Odpovídá na Milan Křepelka
blazoid:

Tak jsem to napsal dle Tvých rad (System.IO.Di­rectory.Create), když jsem však začal za tečkou psát Create opět nic. Mám však starší verzi MVS - konkrétně 2010, nemůže to být příčinou?

 
Odpovědět 6.11.2015 12:34
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

Nepravděpodobné

podle dokumentace je

System.IO.Direc­tory.CreateDi­rectory

s námi již delší dobu

https://msdn.microsoft.com/…atedirectory(v=vs.110).aspx

Eliminuj chybu. Udělej nový projekt v nějakým lepším názvem. Slovo Directory pro jistotu zcela vynech a zkus to znova.

 
Odpovědět 6.11.2015 13:13
Avatar
blazoid
Člen
Avatar
blazoid:

Ahoj, tak už to chodí - díky moc.

 
Odpovědět 6.11.2015 19:36
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 26. Zobrazit vše