C# - Állományinformációk lekérdezése; Mappák megnyitása

Windows Shell objektumok használata 2. rész

forráskód letöltése
A sorozat előző számában megismerhettük, hogy miként használhatjuk fel a Windows Shell komponenst projektjeinkben. Bemutattuk, hogyan érhetjük el a fájlrendszer mappáit, tulajdonságaikat. Sorozatunk második részében sem szakadunk el a fájlrendszertől, de újabb osztályok lehetőségeit vizsgáljuk meg. Elkészítünk egy példát, melyben a FolderItem és FolderItems osztályok lehetőségeit ismerhetjük meg.
FolderItem és FolderItems osztályok
A FolderItems osztály segítségével egy adott mappa elemeit (alkönyvtárakat és állományokat) kérdezhetjük le egy kollekcióba. Az osztály metódusainak és property-jeinek segítségével információkat kaphatunk az elemek számáról, valamint hivatkozhatunk az egyes elemekre külön-külön is.
A mappa elemszámának meghatározására a Count property használható. Az item metódus használható arra, hogy egy indexet átadva paraméterként elérjük a mappa egy adott elemét.
A mappa elemeinek lekérdezésekor tulajdonképpen FolderItem osztályú elemeket találunk a kollekcióban. Az osztály hasznos property-jeinek listája a következő:
  • GetFolder: ha az adott elem mappa, akkor visszaadja annak Folder típusú objektumát.
  • IsBrowsable: visszaadja, hogy a mappa tartalma böngészhető-e, vagy sem.
  • IsFolder: lekérdezhető, hogy az adott elem mappa-e, vagy sem.
  • ModifyDate: az adott elem utolsó módosításának dátumát adja vissza.
  • Name: az adott elem neve.
  • Parent: az adott elem szülőobjektumát adja vissza.
  • Size: az elem mérete bájtban.
A metódusok listája a következő:
  • Verbs: azoknak a cselekvéseknek a listája, melyeket elvégezhetünk az adott elemen a Windows segítségével.
  • InvokeVerb: Elvégez egy karakterlánc formájában megadott műveletet a mappaelemen. A műveletek egyike az „open” karakterlánc által megadható művelet, mely megnyitja a mappát és betölti elemeit az Intézőbe. Amennyiben nem specifikálunk cselekvést, akkor az „open” hajtódik végre, mint alapértelmezett művelet.
Példa
A mellékelt alkalmazásban két feladatot végzünk el. Az első feladatban kigyűjtjük a Windows rendszermappa (alapértelmezésben <meghajtó>:\Windows) alkönyvtárait és állományait rekurzív módon, a fenti osztályok segítségével. A kigyűjtött elemeket a Form-on található TreeView kontrolba töltjük.
Amennyiben az elemek egyikére kattintunk és az adott elem állomány, akkor az egérmutató mellett egy ToolTip-et mutatunk meg az adott elem jellemzőivel. Mappára kattintva nem történik semmi.
A fastruktúra felépítése a FillTreeView metódusban történik. A metódus két paramétert kap: az első az adott elem elérési útvonala, a második egy TreeNode objektum, melyre az aktuális elemet fel kell fűznünk.
Első lépésként létrehozunk egy Folder objektumot a kapott mappához.
f = new Shell32.ShellClass().NameSpace(strDirectory);
A következő lépés, hogy az elemeket egy FolderItems kollekcióba rendezzük.
Shell32.FolderItems items = f.Items();
Ezt követően az elemeket típusuktól függően egy-egy listába kérdezzük le.
foreach(Shell32.FolderItem fi in items)
{
  if (fi.IsFolder)
  {
    directoryList.Add(fi.Path);
  }
  else
  {
    fileList.Add(fi.Path);
  }
}
A mappákon végigmenve felfűzzük azok neveit a fára, majd újra meghívjuk a FillTreeView metódust.
TreeNode newDirNode = new TreeNode();
DirectoryInfo di = new DirectoryInfo(directoryList[i].ToString());
newDirNode.Text = di.Name;
...
FillTreeView(di.FullName,newDirNode);
Az állományokat felfűzzük, további keresés nélkül.
for(int j=0;j<fileList.Count;j++)
{
  TreeNode newFileNode = new TreeNode();
  FileInfo fi = new FileInfo(fileList[j].ToString());
  newFileNode.Text = fi.Name;
  ...
  nodeParent.Nodes.Add(newFileNode);
}
Az egérkattintáskor megvizsgáljuk, hogy melyik facsomópont fölött történt a kattintás.
TreeNode node = treeView1.GetNodeAt(e.X,e.Y);
Majd miután lekérdeztük annak elérési útvonalát, létrehozunk egy FolderItem objektumot, és lekérdezzük a tulajdonságait.
Shell32.FolderItem item = items.Item(i);
tooltip = "Elem neve: " + item.Name + '\u000D' +  "Elérési útvonal: " + item.Path + '\u000D' + "Módosítás dátuma: " + item.ModifyDate + '\u000D' + "Mérete: " + item.Size.ToString() + " bájt";
toolTip1.SetToolTip(treeView1,tooltip);
A példa második részében kipróbálhatjuk, hogy miként nyithatunk meg egy mappát a Windows-ban, vagyis hogyan jeleníthetjük meg elemeit az Intézőben.
A ComboBox kontrolban egy lista található néhány nevezetes mappával, melyek tartalmát megnézhetjük. Létrehoztunk egy felsorolt típust, melynek elemei egész konstansok, és amelyek egy-egy mappa megnyitására utasítanak, amennyiben átadjuk őket a megfelelő metódusnak.
A metódus a Shell objektum Explore metódusa, a hívás módja pedig a következő:
switch(comboBox1.SelectedIndex)
{
  case 0: new Shell32.ShellClass().Explore(SpecialFolders.DESKTOP);
  break;
  ...
A művelet eredményeként felbukkan az Intéző megfelelő ablaka, megmutatva a lista adott elemének gyermekobjektumait.

Windows Shell objektumok használata cikksorozat