Skip Navigation Links.
Skip Navigation Links.

.net student

microsoft

Vyhledávání v obsahu portálu


Přihlášení uživatele

Přihlášení uživatele

Členové:
  • Poslední nový uživatel Poslední: vavel
  • Nový dnes Dnes nových 3
  • Nový včera Včera nových: 5
  • Počet uživatelů: Celkem: 4413
Lidé online:
  • Návštěvníci: Návštěvníků: 23
  • Registrovaných Členů: 1
  • Celkem Celkem: 24
Mapa Stranek

MCTS 3. díl - Vstup / Výstup

Vítám Vás u dalšího dílu, ve kterém se zaměříme na souborový systém. Připravil jsem si pro Vás aplikaci, kterou jsem nazval "Průzkumník". Tzv. "čistou" verzi, kterou budeme postupně spolu doprogramovávat a zárověn finální verzi naleznete v sekci "ke stažení" po názvem "MCTS 3. díl - Průzkumník"

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);
}

Lukáš Kubis :: 13. května 2008 :: 1185 shlédnutí :: 0 komentářů
kategorie: Obecná .Net témata, Vývoj Windows aplikací

Comments

Nyní zde nejsou žádné kometáře. Buďte první!
Musíte být přihlášen pro posílání komentářů. Přihlásit se můžete zde
Přehled posledních diskuzí

Přehled posledních diskuzí

  1. Nekultura výlepu plakátů [11.21.2008 8:00 dop.]
    Proč proboha je na FEL ČVUT na Karláku budova polepena plakáty na zdech, přímo na omítce? Vrcholnou ukázkou je zeď před ...
  2. RE: SQL server 2008 MSDN AA [11.11.2008 7:26 odp.]
    Diky, ale tim to bohuzel neni.
  3. Dotaz na organizátory MS Festu [11.10.2008 4:31 odp.]
    Ahoj MSP,rád bych se zeptal jednoho z organizátorů MS Festu na jeden nestandardní dotaz, který se mi nechce psát na veře...
  4. RE: SQL server 2008 MSDN AA [11.08.2008 1:51 odp.]
    Dobrý den,pro spuštění instalace SQL Serveru 2008 je třeba mít nainstalován .NET Framework 3.5 Service Pack 1 - je to uv...
Novinky z klubů

Novinky z klubů

  1. Programátorské večery: Tipy a triky pro Visual Studio 13. listopadu 2008
    S Visual Studiem pracujeme každý den, ale málokdo zná šechny užitečné klávesov...
  2. Programátorské večery: PowerShell 12. listopadu 2008
    Platformu PowerShell již netřeba představovat. Co ovšem přináší pro .NET programátory...
  3. Programátorské večery: Entity Framework 30. října 2008
    Na této akci bude představena technologie Entity Framework. Podíváme se na tato témata: ...
  4. Programátorské večery: LINQ 26. října 2008
    LINQ je nový revoluční přístup pro práci s daty, který přichází s .NET ...
Co se píše jinde

Co se píše jinde

Řešení problémů s identitou webu u Personal Information Cards

Téměř přesně před rokem jsem si v článku Jak se zjišťuje identita webu u Personal Information Cards? stěžoval na to, ...

TechEd Developers 2008: Den druhý až čtvrtý

Konečně jsem získal dostatek času, abych sepsal zážitky z druhého až čtvrtého dne TechEdu.

TechEd Developers 2008: Den první

První den TechEdu je vždycky takový nanečisto, ostatně jsou v něm jenom dva přednáškové sloty. A keynote. Na co že se...

Výběr serveru

Výběr vhodného serveru představuje volbu při níž musíme přihlédnout k mnoha kritériím, které lze shrnout do následují...

Podívejte se své cache na zoubek

Robustní cacheovací mechanismus je jedna z nejužitečnějších technologií, jaké ASP.NET nabízí. Při vhodném použití můž...