Zpět na seznam článků     Číst komentáře (0)     Verze pro tisk

C# tipy #3 - Vlastní průzkumník

Autor: sukovanej   
30.11.2012

V dnešním tipu si ukážeme, jak si udělat ekvivalent k souborovému průzkumníkovi ve Windows.


Návrh aplikace

Pro zobrazování více položek s dalšími informacemi (u souboru a složek budeme chtít znát např. datum vytvoření) se nejvíce hodí komponenta ListView. Přidejte si ji na formulář a rovnou komponentu nastavíme. Jednak budeme chtít zobrazovat seznam s informacemi o každé položce. Klikněte na šipku v pravé horní části u komponenty a položku View nastavte na Details. Dále musíme přidat jednotlivé sloupce, v kterých budeme informace vypisovat. Znovu klikněte na onu kouzelnou šipku u komponenty ListView a klikněte na Edit columns. V okně, které vám vyskočí přidejte tři sloupce kliknutím na Add. Každému sloupci můžete upravit titulek pomocí vlastnosti Text v prvé části okna. Pojmenujte je přesně v tomto pořadí - Název, Popis, Datum vytvoření

Dále na formulář přidejte jedno textové pole a jedno tlačítko. Výsledek by mohl vypadat asi takto :

Získání souborů a složek

Nejdůležitější částí naší aplikací bude metoda, kterou nazveme GetFiles. Bude přebírat jeden argument typu string - absolutní adresu složky. Ještě předtím, než začneme sestavovat algoritmus, přidejte si do souboru Form1.cs tyto jmenné prostory, budeme je potřebovat.

  1. using System.IO;
  2. using System.Threading.Tasks;

Třída, která poskytuje prostředky pro práci s adresářem, se jmenuje DirectoryInfo, takže ze všeho nejdříve si vytvoříme její instanci a předáme jí jeden parametr a sice argument naší metody, tedy proměnnou reprezentující adresu složky. V dalším kroku si vytvoříme pole s informace o složce a pole s informace o souboru. Třída DirectoryInfo má metody GetDirectories() a GetFiles(), které právě taková pole vrací, takže je jen přiřadíme do příslušných polí. Dále obě tato pole projdeme foreach cyklem. V cyklu vytvoříme instanci třídy ListViewItem, kterou potom použijeme jako parametr funkce Add kolekce Items komponenty ListView. Instanci předáme název souboru/složky - file.Name, dále, jestli se jedná o složku, nebo o soubor a datum vytvoření - file.CreationTime.ToShortDateString().

  1. private void GetItems(string path)
  2. {
  3.    DirectoryInfo directory = new DirectoryInfo(path);
  4.    DirectoryInfo[] directories = directory.GetDirectories();
  5.  
  6.    foreach (DirectoryInfo file in directories)
  7.    {
  8.       ListViewItem item = new ListViewItem();
  9.       item.Text = file.Name.ToString();
  10.       item.SubItems.Add("Složka");
  11.       item.SubItems.Add(file.CreationTime.ToShortDateString());
  12.       listView1.Items.Add(item);
  13.    }
  14.  
  15.    FileInfo[] files = directory.GetFiles();
  16.  
  17.    foreach (FileInfo file in files)
  18.    {
  19.       ListViewItem item = new ListViewItem();
  20.       item.Text = file.Name;
  21.       item.SubItems.Add("Soubor");
  22.       item.SubItems.Add(file.CreationTime.ToShortDate String());
  23.       listView1.Items.Add(item);
  24.    }
  25. }

Otevření složky, nebo souboru

Nyní budeme požadovat, aby po dvojkliku na nějakou položku se v případě složky zobrazil následující podadresář a případě souboru, aby se otevřel ve výchozím programu. Problém je, že komponenta ListView nemá přímo událost pro dvojklik na položku. Musíme tedy použít jen událost DoubleClick. Potom musíme zjistit, jestli při tomto dvojkliku byla vybraná nějaká položka. Pokud ano, zjistíme, jestli se jedná o složku, nebo soubor a provedeme příslušnou operaci. V případě, že uživatel klikne na složku, musíme vymazat stávající obsah ListView, přidat do něj nový (jen použijeme naši metodu GetFiles) a změnit text v textovém poli na novou adresu a pokud se jedná o soubor, pomocí metody Start třídy Proccess zobrazíme soubor ve výchozím programu.

  1. if (listView1.SelectedItems.Count == 1)
  2. {
  3.    if (listView1.SelectedItems[0].SubItems[1].Text.ToString() == "Složka")
  4.    {
  5.       string path = listView1.SelectedItems[0].SubItems[0].Text.ToString() + "/";
  6.       listView1.Items.Clear();
  7.       GetItems(textBox1.Text + path);
  8.       textBox1.Text += path;
  9.    }
  10.    else
  11.    {
  12.       Process.Start(textBox1.Text + listView1.SelectedItems[0].SubItems[0].Text.ToString());
  13.    }
  14. }

Poslední vychytávky

Teď nám zbývá jen naprogramovat funkčnost tlačítko a zajistit, aby se něco dělo i při startu programu (např. necháme zobrazit obsah adresáře C:\)

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3.    textBox1.Text = "C:/";
  4.    GetItems(textBox1.Text);
  5. }
  6.  
  7. private void button1_Click(object sender, EventArgs e)
  8. {
  9.    listView1.Items.Clear();
  10.    GetItems(textBox1.Text);
  11. }

A výsledek...

Závěr

Aplikace má samozřejmě mnoho nedostatků. Například, pokud by uživatel změnil text v textovém poli a potom otevřel nějakou položku, s docela velkou jistotou by aplikace vyhodila chybu, proto by bylo lepší si vždy ponechávat absolutní adresy souborů a složek. Můžete si zkusit aplikaci vylepšit, např. zobrazovat více informací o položkách v seznamu. Třída DirecotryInfo poskytuje například datum poslední změny, nebo dokonce může adresář i vytvořit.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 2.63/8

1  2  3  4  5    
(známkování jako ve škole)