První funkcionalitu, kterou bude náš průzkumník umět, bude po startu aplikace načtení všech disků dostupných v systému. Než zde ukážu kód, podíváme se trochu zblízka na třídu
DriveInfo
Properties
- long AvailableFreeSpace - vrátí velikost dostupného místa na disku
- string DriveFormat - vrátí název formátu, který využívá daný disk (FAT32 nebo NTFS)
- DriveType DriveType - vrací typ disku, který může být:
- CDRom - mechanika
- Fixed - disk
- Network - síťový disk
- NoRootDirectory - disk, který nemá rootovský adresář
- RAM - RAM disk
- Removable - výjimatelný disk
- Unknown - disk nebyl rozpoznán
- bool IsReady - vrací true je-li zařízení připraveno, jinak false
- string Name - název disku
- DirectoryInfo RootDirectory - vrací objekt typu DirectoryInfo, který reprezentuje rootovský adresář
- long TotalFreeSpace - vrátí velikost volného místa
- long TotalSize - vrátí celkovou velikost disku
- string VolumeLabel - Lze nastavit popisek disku, pokud není daný disk readonly
Static Method
- DriveInfo[] GetDrives() - vrátí všechny disky nacházející se v systému
Po krátkém shrnutí všech vlastností a metod, které nabízí třída DriveInfo můžeme doplnit kód do metody FormOnLoad:
private void FormOnLoad(object sender, EventArgs e)
{
// zde si načtu všechny disky, které se nacházejí v systému
foreach (DriveInfo di in DriveInfo.GetDrives())
{
cbDrives.Items.Add(di.Name);
}
}
|
Když spustíme aplikaci, v ComboBoxu se budou nacházet všechny dostupné disky. Pokud si ovšem vybereme jakýkoliv disk, nic se nestane. Než se vrhneme na doplnění této funkcionality, podíváme se na třídy FileInfo (soubory) a DirectoryInfo (adresáře)
FileInfo
Properties
- DirectoryInfo Directory - vrátí objekt typu DirectoryInfo reprezentující adresář, ve kterém se soubor nachází
- string DirectoryName - stejné jako Directory, akorát vrátí pouze název adresáře
- bool IsReadOnly - vlastnost signalizující zda-li je soubor jenom pro čtení či nikoliv
- long Length - velikost souboru
Methods
- StreamWriter AppendText() - vytvoří objekt StreamWriter, který umožní připojit text
- FileInfo CopyTo(string destFileName) - vytvoří kopii souboru
- FileStream Create() - vytvoří FileStream objekt na základě informací aktuálního souboru
- StreamWriter CreateText() - vytvoří objekt StreamWriter a soubor pro zápis textu
- void Decrypt() - rozšifruje soubor
- void Encrypt() zašifruje soubor
- void MoveTo(string destFileName) - přesune soubor na nové umístění
- FileStream Open(FileMode mode) - otevře soubor
- FileStream OpenRead() - otevře soubor pouze pro čtení
- StreamReader OpenText() - otevře soubor a vrátí objekt typu StreamReader pro čtení textu
- FileStream OpenWrite() - otevře soubor s přístupem pouze pro zápis
- void Replace(string destFileName, string destBackupFileName) - nahradí soubor novým souborem
DirectoryInfo
Properties
- DirectoryInfo Parent - vrátí DirectoryInfo objekt reprezentující rodičovský adresář
- string Root - vrátí název rootovského adresáře
Methods
- void Create() - vytvoří adresář
- DirectoryInfo CreateSubdirectory(string path) - vytvoří podadresář
- DirectoryInfo[] GetDirectories() - vrátí podadresáře aktuálního adresáře
- FileInfo[] GetFiles() - vrátí soubory v aktuálním adresáři
- FileSystemInfo[] GetFileSystemInfos() - vrátí soubory i podadresáře nacházející se v aktuálním adresáři
- void MoveTo(string destDirName) - přesune aktuální adresář na nové umístění
Do obsluhy události cbDrivesOnChanged doplníme následující kód, který nám zajistí to, že po výběru disku se nám zobrazí příslušné adresáře, soubory a doplňující informace jako je velikost, volné místo a typ:
private void cbDrivesOnChanged(object sender, EventArgs e)
{
// abych neměl duplicitní data
lbFiles.Items.Clear();
tvFolders.Nodes.Clear();
// vytvořím si objekt DriveInfo
DriveInfo drive = new DriveInfo(cbDrives.SelectedItem.ToString());
// otestuju zda-li je disk připraven
if (drive.IsReady)
{
// vypíšu informace o velikosti disku, volném místě a typu
lblDriveInfo.Text =
string.Format("Available: {0} MB - Free: {1} MB - Drive Type: {2}",
drive.TotalSize / 1000000,
drive.TotalFreeSpace / 1000000,
drive.DriveType.ToString());
// projdu všechny adresáře nacházející v umístění které mi udává
// combobox a přidám do objektu tvFolders, který je typu TreeView
DirectoryInfo dirInfo = new DirectoryInfo(drive.Name);
foreach (DirectoryInfo di in dirInfo.GetDirectories())
{
tvFolders.Nodes.Add(di.FullName, di.Name);
}
// projdu všechny soubory a naplním lbFiles (ListBox)
foreach (FileInfo fi in dirInfo.GetFiles())
{
lbFiles.Items.Add(fi.Name);
}
}
else
{
lblDriveInfo.Text = "Disk není připraven";
}
}
|
Už se nám tedy krásně v TreeView zobrazí adresářová struktura, ale momentálně je bez funkčnosti. Proto do metody
tvFoldersOnNodeMouseClick doplníme kód, který nám načte podadresáře adresáře, na který jsme kliknuli:
private void tvFoldersOnNodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
// zamezím duplicitám
e.Node.Nodes.Clear();
lbFiles.Items.Clear();
// Vytvořím si objekt DirectoryInfo, jako parametr předám název adresáře,
// na který bylo kliknuto. Potom už jenom projdu podadresáře, soubory
// a přidám do příslušných kolekcí
DirectoryInfo dirInfo = new DirectoryInfo(e.Node.Name);
foreach (DirectoryInfo di in dirInfo.GetDirectories())
{
e.Node.Nodes.Add(di.FullName, di.Name);
}
foreach (FileInfo fi in dirInfo.GetFiles())
{
lbFiles.Items.Add(fi.Name);
}
}
|
V poslední části našeho velice jednoduchého průzkumníka obsloužíme událost
lbFilesOnChanged, která nastane ve chvíli když se budeme pohybovat po jednotlivých souborech. Tuto událost využijeme pro zobrazení velikosti daného souboru v KB a vlastnosti zda-li je soubor jen pro čtení či nikoliv. Jelikož zde využívám třídu
Path, tak se na ní nejdříve podíváme:
Path
Jak už z názvu plyne tato třída má na starost vše co souvisí s cestou v souborovém systému.
Methods
- string ChangeExtension(string path, string extension) - vrátí změněnou příponu. Nezmění ovšem příponu u souboru v souborovém systému!
- string Combine(string path1, string path2) - spojí dvě cesty
- string GetDirectoryName(string path) - vrátí název adresáře
- string GetExtension(string path) - vrátí příponu souboru
- string GetFileName(string path) - vrátí jméno souboru
- string GetFileNameWithoutExtension(string path) - vrátí jméno souboru bez přípony
- string GetFullPath(string path) - vrátí celou cestu. Použití při využití relativních cest
- string GetPathRoot(string path) - vrátí název rootovského adresáře na zadaném umístění
- string GetRandomFileName() - vrátí název náhodného adrsáře či souboru
- string GetTempFileName() - vytvoří soubor a vrátí vcelou cestu
- string GetTempPath() - vrátí cestu od dočasné složky
- bool HasExtension(string path) - otestuje zda-li má soubor příponu
- bool IsPathRooted(string path) - otestuje zda-li je zadaná cesta zahrnuje rootovský adresář
A zde je slibovaný kód:
private void lbFilesOnChanged(object sender, EventArgs e)
{
// při pohybu po souborech budu aktualizovat informace jako je velikost, ...
string dir, file;
// pokud jsem neklikl v TreeView na žádnou složku je hodnota SelectedNode rovna
// null a lze z toho usoudit, že daný soubor se nachází přímo v rootu disku
// Pokud je různý od null, poskládám si cestu z hodnot z TreeView
if (tvFolders.SelectedNode == null)
dir = cbDrives.SelectedItem.ToString();
else
dir = tvFolders.SelectedNode.Name;
// získám si název souboru
file = lbFiles.SelectedItem.ToString();
// poskládám si cestu, tak že jí složím z cesty adresáře a názvu souboru
string path = Path.Combine(dir, file);
// Vytvořím nový objekt FileInfo
FileInfo fileInfo = new FileInfo(path);
lblFileInfo.Text = string.Format("Size: {0} KB - readonly: {1}",
fileInfo.Length / 1024,
fileInfo.IsReadOnly ? "Yes" : "No");
}
|
To je z našeho průkumníka vše. Dálší rozšíření nechám na Vás :-)
Článek tímto ovšem nekončí, nyní nás čeká FileSystemWatcher
FileSystemWatcher
Tato třída slouží k monitorování adresářů. Chcete-li mít přehled např. o všech souborech, které se vytvořily během instalace, pak je FileSystemWatcher správná volba. Pomocí property Path nastavíme cestu k adresáři ve kterém se bude "hlídat". Chceme-li sledovat pouze určité soubory, můžeme nastavit Filter. Posledním možným nastavením je IncludeSubdirectories, kterým řekneme, že se mají hlídat i podadresáře. Nakonec pouze obsloužíme události, které mohou vzniknout při sledování (Changed, Created, Deleted, Renamed) a zapneme sledování změn pomocí EnableRaisingEvents.
static void Main(string[] args)
{
FileSystemWatcher watcher = new FileSystemWatcher();
// chci sledovat disk S
watcher.Path = "S:\\";
// pouze textove soubory: watcher.Filter = "*.txt";
// pokud chci vsechny soubory, necham filter tak jak je :]
// zahrneme podadresare
watcher.IncludeSubdirectories = true;
// obslouxime udalosti
watcher.Changed += OnChanged;
watcher.Created += OnCreated;
watcher.Deleted += OnDeleted;
watcher.Renamed += OnRenamed;
// zapnu sledovani
watcher.EnableRaisingEvents = true;
while (true)
{
// nekonecny cyklus proto, abych
// mohl sledovat zda-li se neco vypise
// kdy vytvorim soubor na disku S
}
}static void OnRenamed(object sender, RenamedEventArgs e)
{
Console.WriteLine("soubor {0} byl prejmenovan na {1}.", e.OldName, e.Name);
}
static void OnDeleted(object sender, FileSystemEventArgs e)
{
Console.WriteLine("soubor {0} byl smazan.", e.Name);
}
static void OnCreated(object sender, FileSystemEventArgs e)
{
Console.WriteLine("soubor {0} byl vytvoren.", e.Name);
}
static void OnChanged(object sender, FileSystemEventArgs e)
{
Console.WriteLine("soubor {0} byl zmenen.", e.Name);
}
|
|