13. díl - Práce se soubory a složkami v C# .NET

C# .NET Práce se soubory Práce se soubory a složkami v C# .NET

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:

  • Exists("soubor") - Vrací true, pokud zadaný soubor existuje.
  • Copy("zdroj", "cil") - Zkopíruje soubor ze zdrojového umístění na cílové. Můžeme zadat i třetí parametr typu bool, zda se má soubor při existenci přepsat.
  • Move("zdroj", "cil") - Přesune daný soubor na cílové umístění.
  • Delete("soubor") - Vymaže daný soubor.

Číst jejich atributy:

  • GetAttributes("sou­bor") - Vrací flagový typ FileAttributes s následujícími flagy:

Normal, ReadOnly, Hidden, System, Directory, Archive, Temporary, Compressed, Offline, Encrypted.

A také atributy měnit:

  • SetAttributes("sou­bor", FileAttributes) - Nastaví danému souboru dané atributy.

U souboru můžeme jednoduše zjistit jednotlivé časy:

  • GetCreationTi­me("soubor") - Vrátí datum a čas vytvoření.
  • GetLastAccessTi­me("soubor") - Vrátí datum a čas posledního přístupu.
  • GetLastWriteTi­me("soubor") - Vrátí datum a čas poslední změny.

A také je změnit:

  • SetCreationTi­me("soubor", DateTime) - Nastaví datum a čas vytvoření.
  • SetLastAccessTi­me("soubor", DateTime) - Nastaví datum a čas posledního přístupu.
  • SetLastWriteTi­me("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ř. GetCreationTi­meUtc).

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.

Čí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 (typu DirectoryInfo, více dále).
  • DirectoryName - Vrátí cestu k souboru bez jeho názvu a posledního lomítka.
  • IsReadOnly - Soubor je 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 typu bool 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 FileInfo.
Atributy
  • FullPath - Celková cesta k souboru nebo složce.
  • 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

  • CreateDirecto­ry("slozka") - Vytvoří danou složku.
  • Delete("slozka") - Vymaže danou prázdnou složku. Pokud zadáme 2. parametr typu bool s hodnotou true, vymaže složku včetně souborů a podsložek.
  • Exists("slozka") - Vrací true, pokud daná složka existuje.

S datem a časem pracujeme pomocí metod: **GetCreation­Time("cesta"), GetLastAccessTi­me("cesta"), GetLastWriteTi­me("cesta") a SetCreationTi­me("cesta"), SetLastAccessTi­me("cesta"), SetLastWriteTi­me("cesta").

  • GetLogicalDri­ves() - Vrátí do stringového pole logické disky ve formátu např "C:\".
  • GetParent("sloz­ka") - Vrátí nadřazenou složku.
  • Move("zdroj", "cil") - Přesune složku do cílového umístění.
  • GetDirectoryRo­ot("slozka") - Vrátí kořen dané složky.

Můžeme zjistit nebo modifikovat aktuální složku:

  • GetCurrentDirec­tory()
  • SetCurrentDirec­tory("slozka")
  • EnumerateDirec­tories("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("sloz­ka") - Platí to samé, jako pro EnumerateDirec­tories, pouze nám zde jsou navráceny názvy souborů.
  • EnumerateFile­SystemEntries("sloz­ka") - Platí to samé, jako pro EnumerateDirec­tories, pouze jsou nám zde navráceny jak složky, tak soubory.

Obsah složky nám navrátí také metody GetDirectories(), GetFiles() a GetFileSystemEn­tries(). 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

Directory info 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 datem a časem 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ší parametry složky, které jsou stejné, jako u třídy File:

  • Exists - 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.
  • CreateSubdirec­tory("cesta") - Vytvoří podsložku/podsložky v dané složce.
  • Delete() - Vymaže danou složku, která musí být prázdná.
  • Delete(rekurziv­ne) - Pokud je parametr true, budou rekurzivně vymazány i soubory a podsložky.
  • MoveTo("cil") - Přesune danou složku do cílového umístění.
  • Refresh - Obnoví data v instanci DirectoryInfo.

K prohledávání složky platí to samé, jako u třídy Directory, máme zde metody EnumerateDirec­tories(), EnumerateFiles() a EnumerateFile­SystemInfos(). 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 k souboru nebo složce.
  • OriginalPath - Cesta, 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

  • ChangeExtensi­on("cesta", "přípona") - Vrátí cestu se změnenou 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 nebo 3 stringy.
  • GetDirectoryNa­me("cesta") - Vrací nadřazenou složku společně s celou cestou.
  • GetExtension("ces­ta") - Vrátí příponu souboru.
  • GetFileName("ces­ta") - Vrátí jméno souboru.
  • GetFileNameWit­houtExtension("ces­ta") - Vrátí jméno souboru bez přípony.
  • GetFullPath("ces­ta") - Vrátí absolutní cestu ze zadané cesty (např. z relativní).
  • GetInvalidFile­NameChars() - Vrací pole znaků, které se nesmějí nacházet v názvu souboru.
  • GetInvalidPat­hChars() - Vrací pole znaků, které se nesmějí nacházet v cestě.
  • GetPathRoot("ces­ta") - Vrací kořenovou složku dané cesty.
  • GetRandomFile­Name() - 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("ces­ta") - Vrátí true, pokud má daný soubor příponu.
  • IsPathRooted("ces­ta") - 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ů:

  • AltDirectorySe­paratorChar - Alternativní oddělovač složek, nejčastějí "/".
  • DirectorySepa­ratorChar - Oddělovač složek, nejčastěji **.
  • PathSeparator - Oddělovač jednotlivých cest, nejčastěji ";".
  • VolumeSeparator­Char - Oddělovač svazků, nejčastěji ":".

 

  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 (5 hlasů) :
4.84.84.84.84.8


 


Miniatura
Předchozí článek
Výjimky v C# .NET podruhé
Miniatura
Všechny články v sekci
Práce se soubory v C#

 

 

Komentáře

Avatar
Petr Nymsa
Redaktor
Avatar
Petr Nymsa:

Nechci rejpat, ale u DirectoryInfo je ukázka kódu špatně. Začátečníky by to mohlo mást :)

Odpovědět 22.3.2013 15:28
Pokrok nezastavíš, neusni a jdi s ním vpřed
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovědět 24.6.2013 16:16
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
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 2 zpráv z 2.