This article has been localized into Czech by the community.
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.