Lekce 13 - Práce se soubory a složkami v C# .NET
V minulé lekci, Výjimky v C# .NET podruhé, jsme dokončili výjimky.
Dnes si popíšeme třídy v .NETu, které nejsou nijak závislé na typu souboru a jejich použití je tedy obecné. Umožňují pracovat se soubory a složkami na úrovni operačního systému, což jistě budeme v našich aplikacích potřebovat.
File
Třída File
na sobě obsahuje statické metody
pro obecnou práci se soubory. Se soubory můžeme jednoduše manipulovat
pomocí:
Exists("soubor")
- Vracítrue
, pokud zadaný soubor existuje.Copy("zdroj", "cíl")
- Zkopíruje soubor ze zdrojového umístění na cílové. Můžeme zadat i třetí parametr typubool
, zda se má soubor při existenci přepsat.Move("zdroj", "cíl")
- Přesune daný soubor na cílové umístění.Delete("soubor")
- Vymaže daný soubor.
Číst jejich atributy:
GetAttributes("soubor")
- Vrací flagový typFileAttributes
s následujícími flagy:Normal
ReadOnly
Hidden
System
Directory
Archive
Temporary
Compressed
Offline
Encrypted
A také atributy měnit:
SetAttributes("soubor", FileAttributes)
- Nastaví danému souboru dané atributy.
U souboru můžeme jednoduše zjistit jednotlivé časy:
GetCreationTime("soubor")
- Vrátí datum a čas vytvoření.GetLastAccessTime("soubor")
- Vrátí datum a čas posledního přístupu.GetLastWriteTime("soubor")
- Vrátí datum a čas poslední změny.
A také je změnit:
SetCreationTime("soubor", DateTime)
- Nastaví datum a čas vytvoření.SetLastAccessTime("soubor", DateTime)
- Nastaví datum a čas posledního přístupu.SetLastWriteTime("soubor", DateTime)
- Nastaví datum a čas poslední změny.
Všechny metody pro práci s datem a časem souborů mají ještě variantu
končící na Utc
pro práci s časem v mezinárodním formátu
(např. GetCreationTimeUtc()
).
FileInfo
Třída FileInfo
je velmi podobná třídě File
,
avšak její metody nejsou statické. Instanci
FileInfo
vytvoříme pro jeden soubor a její metody se poté
automaticky vztahují k tomuto souboru. Využijeme ji hlavně v případě, kdy
pracujeme déle s jedním souborem a tím pádem by bylo použití
File
neefektivní.
Třída bere v konstruktoru jako parametr soubor, se kterým bude pracovat:
FileInfo fileInfo = new FileInfo("soubor.txt");
Vlastnosti
Opět můžeme číst či zapisovat data a časy:
CreationTime
- Datum a čas vytvoření souboru.LastAccessTime
- Datum a čas posledního přístupu.LastWriteTime
- Datum a čas poslední změny.
Opět existují i verze končící Utc
pro světový čas.
Můžeme číst či modifikovat atributy:
Attributes
- Atributy souboru ve formátu flagůFileAttributes
.
A zjistit další parametry souboru:
Exists
- Vracítrue
pokud soubor existuje.Name
- Jméno souboru.FullName
- Jméno souboru včetně cesty.Extension
- Přípona souboru.Directory
- Vrátí instanci rodičovské složky (typuDirectoryInfo
, více dále).DirectoryName
- Vrátí cestu k souboru bez jeho názvu a posledního lomítka.IsReadOnly
- Zdali je soubor jen pro čtení.Length
- Velikost souboru v bytech.
Metody
Se souborem můžeme manipulovat pomocí těchto metod:
CopyTo("cil")
- Zkopíruje soubor na dané cílové umístění. Přidáním parametru typubool
opět můžeme nastavit, zda se má soubor při existenci přepsat či nikoli.Delete()
- Vymaže soubor.MoveTo("cil")
- Přesune soubor na cílové umístění.Refresh()
- Obnoví data v instanciFileInfo
.
Atributy
FullPath
- Celková cesta k souboru.OriginalPath
- Cesta, jak ji zadal uživatel.
Directory
Directory
je obdoba třídy File
, avšak
uzpůsobená pro složky. Metody jsou opět statické, pojďme
si je představit:
Metody
CreateDirectory("slozka")
- Vytvoří danou složku.Delete("slozka")
- Vymaže danou prázdnou složku. Pokud zadáme 2. parametr typubool
s hodnotoutrue
, vymaže složku včetně souborů a podsložek.Exists("slozka")
- Vracítrue
, pokud daná složka existuje.
S daty a časy pracujeme pomocí metod:
GetCreationTime("cesta")
GetLastAccessTime("cesta")
GetLastWriteTime("cesta")
SetCreationTime("cesta")
SetLastAccessTime("cesta")
SetLastWriteTime("cesta")
GetLogicalDrives()
- Vrátí do stringového pole logické disky ve formátu napřC:\
.GetParent("slozka")
- Vrátí nadřazenou složku.Move("zdroj", "cil")
- Přesune složku do cílového umístění.GetDirectoryRoot("slozka")
- Vrátí kořen dané složky.
Můžeme zjistit nebo modifikovat aktuální složku:
GetCurrentDirectory()
SetCurrentDirectory("slozka")
EnumerateDirectories("slozka")
- Vrátí kolekci názvů podsložek v dané složce.
Metodě můžeme předat jako 2. parametr pattern k
hledání, který obsahuje *
nebo ?
. Příklad
patternu může tedy být "*data??"
, kdy bude následovat
libovolný text, poté text "data"
a nakonec právě 2 libovolné
znaky.
Jako 3. parametr můžeme uvést ještě SearchOption
, což je
enum
s hodnotami TopDirectoryOnly
a
AllDirectories
. Takto můžeme tedy prohledávat i podsložky.
EnumerateFiles("slozka")
- Platí to samé, jako proEnumerateDirectories
, pouze nám zde jsou navráceny názvy souborů.EnumerateFileSystemEntries("slozka")
- Platí to samé, jako proEnumerateDirectories
, pouze jsou nám zde navráceny jak složky, tak soubory.
Obsah složky nám navrátí také metody
GetDirectories()
,
GetFiles()
a
GetFileSystemEntries()
. Metody se shodují i co se
týče parametrů. Jediným rozdílem je, že namísto IEnumerable
vracejí pole. U IEnumerable
je výhoda, že
můžeme s kolekcí pracovat ještě dříve, než jsou všechny informace
načteny z disku. U pole může při více souborech tato operace na chvíli
program zastavit.
DirectoryInfo
DirectoryInfo
je nestatická obdoba třídy
Directory
. Situace je stejná, jako u File
a
FileInfo
. Instance se tvoří opět zadáním cesty do
konstruktoru:
DirectoryInfo directoryInfo = new DirectoryInfo("C:\slozka");
Třída je velmi nápadně podobná třídě FileInfo
a to
proto, že jsou obě odděděny ze společného předka, třídy
FileSystemInfo
.
Vlastnosti
Ke čtení či změně atributů použijeme nám již dobře známé:
Attributes
- Atributy souboru ve formátu flagůFileAttributes
.
Manipulace s daty a časy je opět totožná:
CreationTime
- Datum a čas vytvoření souboru. Opět existují i verze končícíUtc
pro světový čas.LastAccessTime
- Datum a čas posledního přístupu.LastWriteTime
- Datum a čas poslední změny.
Povědomé nám budou i další vlastnosti složky, které jsou stejné, jako
u třídy File
:
Exists
- Vracítrue
, pokud složka existuje.Name
- Název složky.FullName
- Celá cesta ke složce.Extension
- Přípona souboru (pokud je v cestě obsažen).Parent
- Nadřazená složka.Root
- Kořenová složka.
Metody
Create()
- Vytvoří danou složku.CreateSubdirectory("cesta")
- Vytvoří podsložku/podsložky v dané složce.Delete()
- Vymaže danou složku, která musí být prázdná.Delete(rekurzivně)
- Pokud je parametrtrue
, budou rekurzivně vymazány i soubory a podsložky.MoveTo("cíl")
- Přesune danou složku do cílového umístění.Refresh
- Obnoví data v instanciDirectoryInfo
.
K prohledávání složky platí to samé, jako u třídy
Directory
, máme zde metody EnumerateDirectories()
,
EnumerateFiles()
a EnumerateFileSystemInfos()
. Název
té poslední se změnil. Opět mají své protějšky i s prefixem
Get
, kde vracejí pole. Rozdíl je ovšem v tom, že nyní
jsou nám v kolekci navráceny instance DirectoryInfo
,
FileInfo
a FileSystemInfo
, nikoli jen
textové řetězce!
Atributy
FullPath
- Celková cesta ke složce.OriginalPath
- Cesta tak, jak ji zadal uživatel.
Vysvětlili jsme si tedy třídy pro práci se soubory a třídy pro práci
se složkami. Můžete použít i třídu FileSystemInfo
, ta
obsahuje ty metody, které byly společné jak pro práci se soubory, tak se
složkami. Všechny jsme si zde již vysvětlili.
Aby byl tutoriál úplný, zmíníme se ještě o třídě Path.
Path
Path
je statická třída, poskytující
funkcionalitu a nastavení pro práci s cestami ke složkám či souborům.
Metody
ChangeExtension("cesta", "přípona")
- Vrátí cestu se změněnou příponou souboru.Combine(pole stringů)
- Spojí stringy v předaném poli do cesty a tu vrátí. Metoda má další dvě přetížení, kde místo pole bere v parametrech 2, 3 nebo 4 stringy.GetDirectoryName("cesta")
- Vrací nadřazenou složku společně s celou cestou.GetExtension("cesta")
- Vrátí příponu souboru.GetFileName("cesta")
- Vrátí jméno souboru.GetFileNameWithoutExtension("cesta")
- Vrátí jméno souboru bez přípony.GetFullPath("cesta")
- Vrátí absolutní cestu ze zadané cesty (např. z relativní).GetInvalidFileNameChars()
- Vrací pole neplatných znaků, které se nesmějí nacházet v názvu souboru.GetInvalidPathChars()
- Vrací pole neplatných znaků, které se nesmějí nacházet v cestě.GetPathRoot("cesta")
- Vrací kořenovou složku dané cesty.GetRandomFileName()
- Vrátí unikátnístring
, který může být použit jako název souboru.GetTempFileName()
- Vytvoří nový dočasný soubor na disku a vrátí k němu cestu.GetTempPath()
- Vrátí cestu ke složce s dočasnými soubory daného uživatele.HasExtension("cesta")
- Vrátítrue
, pokud má daný soubor příponu.IsPathRooted("cesta")
- Vrátítrue
, pokud v sobě cesta obsahuje kořen.
Atributy
Některé součásti cest jsou závislé na konkrétní platformě, přesněji na konkrétním operačním systému. Můžeme k nim přistupovat pomocí následujících atributů:
AltDirectorySeparatorChar
- Alternativní oddělovač složek, nejčastěji"/"
.DirectorySeparatorChar
- Oddělovač složek, nejčastěji"\"
.PathSeparator
- Oddělovač jednotlivých cest, nejčastěji";"
.VolumeSeparatorChar
- Oddělovač svazků, nejčastěji":"
.
Gratuluji vám k dosažení konce kurzu o práci se soubory v C# .NET. Nyní máte dostatečné znalosti z této oblast a můžete pokračovat v kurzu Databáze v C# .NET, kde za nás práci se soubory řeší databázový systém.
V následujícím kvízu, Kvíz - XML, serializace, soubory a složky v C# .NET, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.