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.
V dnešním C# .NET tutoriálu si popíšeme třídy
File
, FileInfo
, Directory
,
DirectoryInfo
a Path
, které se používají pro
práci se soubory a složkami na úrovni operačního
systému.
Třída File
Třída File
na sobě obsahuje statické metody
pro obecnou práci se soubory. Se soubory můžeme jednoduše manipulovat
pomocí metod:
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.
Atributy souborů
U souborů můžeme číst jejich atributy pomocí metody
GetAttributes("soubor")
, která vrací flagový typ
FileAttributes
s následujícími flagy:
Normal
,ReadOnly
,Hidden
,System
,Directory
,Archive
,Temporary
,Compressed
,Offline
,Encrypted
.
Atributy souborů je možné i měnit a to metodou
SetAttributes("soubor", FileAttributes)
, která nastaví
souboru soubor
atributy FileAttributes
.
Datumy a časy souborů
U souboru můžeme jednoduše zjistit jednotlivé datumy a časy pomocí metod:
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é datumy a časy měnit pomocí metod:
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 datumem a časem souborů mají
ještě variantu končící na Utc
pro práci s časem v
mezinárodním formátu, například GetCreationTimeUtc()
.
Třída FileInfo
Třída FileInfo
je velmi podobná třídě File
,
avšak její metody nejsou statické. Instanci typu
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í třídy
File
neefektivní.
Třída FileInfo
bere v parametru konstruktoru soubor, se
kterým bude pracovat:
FileInfo fileInfo = new FileInfo("soubor.txt");
Vlastnosti třídy
FileInfo
Opět můžeme číst či zapisovat datumy a časy pomocí vlastností:
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í na Utc
pro
světový čas.
Vlastnosti pro atributy a parametry souborů
Pomocí instance třídy FileInfo
můžeme číst či
modifikovat atributy souborů pomocí vlastnosti Attributes
ve
formátu flagů FileAttributes
.
Dále můžeme zjistit další parametry souboru pomocí vlastností:
Exists
- Vrátí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
- Vrátítrue
pokud je soubor jen pro čtení.Length
- Velikost souboru v bytech.FullPath
- Celková cesta k souboru.OriginalPath
- Cesta, jak ji zadal uživatel.
Metody třídy FileInfo
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 instanci typuFileInfo
.
Třída Directory
Třída 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 třídy Directory
Uvedeme si metody pro práci s datumem a časem a složkami.
Metody pro práci s datumem a časem
Pro práci s datumem a časem máme k dispozici metody:
GetCreationTime("cesta")
,GetLastAccessTime("cesta")
,GetLastWriteTime("cesta")
,SetCreationTime("cesta")
,SetLastAccessTime("cesta")
,SetLastWriteTime("cesta")
.
Metody pro práci se složkami
Pro práci se složkami můžeme využít metody:
CreateDirectory("slozka")
- Vytvoří složku.Delete("slozka")
- Vymaže prázdnou složku. Pokud zadáme v druhém parametru typubool
hodnotutrue
, vymaže složku včetně souborů a podsložek.Exists("slozka")
- Vracítrue
, pokud daná složka existuje.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.EnumerateDirectories("slozka")
- Vrátí kolekci názvů podsložek v dané složce.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.
Dále můžeme zjistit nebo modifikovat aktuální složku pomocí metod
GetCurrentDirectory()
a
SetCurrentDirectory("slozka")
. Těmto metodám můžeme
předat:
- v druhém parametru pattern k hledání, který obsahuje
*
nebo?
, například"*data??"
, v kterém bude následovat libovolný text, poté text"data"
a nakonec právě dva libovolné znaky. - Třetí parametr
SearchOption
, což jeenum
s hodnotamiTopDirectoryOnly
aAllDirectories
. Takto můžeme tedy prohledávat i podsložky.
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 zastavit program.
Třída DirectoryInfo
Třída DirectoryInfo
je nestatická obdoba třídy
Directory
. Situace je stejná, jako u tříd 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
. Jsou totiž obě odděděny ze společného předka,
třídy FileSystemInfo
.
Vlastnosti třídy
DirectoryInfo
Ke čtení či změně atributů souborů použijeme nám již dobře známou
vlastnost Attributes
ve formátu flagů
FileAttributes
.
Manipulace s datumy a časy je opět totožná:
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í na Utc
pro
světový čas.
Povědomé nám budou i další vlastnosti pro 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žena).Parent
- Nadřazená složka.Root
- Kořenová složka.FullPath
- Celková cesta ke složce.OriginalPath
- Cesta tak, jak ji zadal uživatel.
Metody třídy
DirectoryInfo
Na instanci třídy DirectoryInfo
můžeme použít 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()
,EnumerateFileSystemInfos()
.
Metody mají opět své protějšky 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.
Aby byl tutoriál úplný, zmíníme se ještě o třídě
Path
.
Třída Path
Path
je statická třída, poskytující
funkcionalitu a nastavení pro práci s cestami ke
složkám či souborům.
Metody třídy Path
Na třídě Path
můžeme volat tyto 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 dva, tři nebo čtyři 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říklad 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.
Vlastnosti pro atributy souborů
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 vlastností:
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":"
.
Vysvětlili jsme si tedy třídy pro práci se soubory a
složkami. Můžeme použít i třídu
FileSystemInfo
, která 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.
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í.