TOC

This article has been localized into Czech by the community.

Práce se soubory:

Informace o souborech a adresářích

Třídy File a Directory, které jsme používali v předchozích několika kapitolách, jsou skvělé pro přímou manipulaci se soubory a adresáři. Někdy však chceme místo toho získat informace o nich a znovu nám na pomoc přichází jmenný prostor System.IO: třídy FileInfo a DirectoryInfo. V této kapitole se podíváme na některé způsoby, jak tyto dvě třídy používat.

Třída FileInfo

Nejprve se podívejme na jednoduchý způsob, jak použít třídu FileInfo.

static void Main(string[] args)
{
    FileInfo fi = new FileInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
    if(fi != null)
Console.WriteLine(String.Format("Information about file: {0}, {1} bytes, last modified on {2} - Full path: {3}", fi.Name, fi.Length, fi.LastWriteTime, fi.FullName));
    Console.ReadKey();
}

Vytvoříme novou instanci třídy FileInfo. Vyžaduje jeden parametr, kterým je cesta k souboru, o kterém chceme získat informace. Mohli bychom specifikovat pouze název souboru, ale pro zábavu jsem si myslel, že by bylo zajímavé získat informace o samotné aplikaci, na které pracujeme, tedy o EXE souboru, do kterého je náš projekt kompilován. Jelikož v konzolové aplikaci nemáme přístup k projektu Application (je součástí sestavení WinForms), použijeme trochu Reflexe k získání cesty k aktuálnímu sestavení. To vše je daleko mimo rozsah této konkrétní kapitoly, ale alespoň teď víte.

Jakmile máme instanci FileInfo, vypíšeme o ní všechny druhy informací. Zkuste aplikaci spustit a uvidíte. Vše velmi pěkné a snadné, a pokud se podíváte na třídu FileInfo, uvidíte, že nabízí ještě více informací, stejně jako zkratky pro metody nalezené ve třídě File - a proč ne? S instancí FileInfo máme odkaz na soubor, takže můžeme stejně dobře získat stejné možnosti jako na třídě File.

Třída DirectoryInfo

Informace o jednom souboru jsou v pořádku, ale pomocí třídy DirectoryInfo můžeme získat informace o všech souborech a adresářích v rámci adresáře, což je samozřejmě velmi běžný scénář. Ukážu vám to na jednoduchém příkladu:

DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location));
if(di != null)
{
    FileInfo[] subFiles = di.GetFiles();
    if(subFiles.Length > 0)
    {
Console.WriteLine("Files:");
foreach(FileInfo subFile in subFiles)
{
    Console.WriteLine("   " + subFile.Name + " (" + subFile.Length + " bytes)");
}
    }
    Console.ReadKey();
}

Namísto instance FileInfo vytvoříme instanci DirectoryInfo. Použijeme stejný trik k získání cesty spouštějícího souboru a poté metodu GetDirectoryName() z třídy Path, abychom získali pouze část cesty adresáře. Použijeme metodu GetFiles() k získání pole instancí FileInfo, z nichž každá reprezentuje soubor v adresáři. Poté jej projdeme smyčkou, vytiskneme název každého souboru a velikost.

Možná bychom chtěli také adresáře. Je to stejně snadné:

DirectoryInfo[] subDirs = di.GetDirectories();
if(subDirs.Length > 0)
{
    Console.WriteLine("Directories:");
    foreach(DirectoryInfo subDir in subDirs)
    {
Console.WriteLine("   " + subDir.Name);
    }
}

V některých situacích možná budete chtít pouze soubory nebo adresáře s konkrétním názvem nebo příponou souboru. Naštěstí FileInfo a DirectoryInfo mají pro to také docela dobrou podporu.

To nám dá všechny soubory v adresáři s příponou .exe:

FileInfo[] subFiles = di.GetFiles("*.exe");

To nám dá všechny adresáře, které mají ve jméně někde slovo "test":

DirectoryInfo[] subDirs = di.GetDirectories("*test*");

Můžeme dokonce hledat jak soubory, tak adresáře rekurzivně, což znamená, že bude prohledávat podadresáře podadresářů původního adresáře:

FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.AllDirectories);

Pro prohledávání pouze nejvyššího úrovně adresáře by kód musel vypadat takto:

FileInfo[] subFiles = di.GetFiles("*.exe", SearchOption.TopDirectoryOnly);

Shrnutí

Použitím tříd FileInfo a DirectoryInfo můžeme snadno zjistit informace o souborovém systému na aktuálním počítači.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!