C# - Könyvtárszerkezet listázása Excel munkafüzetbe

forráskód letöltése
Cikkünkben elkészítünk egy komponenst, mely tetszőleges kiindulási mappától kezdődően a könyvtárszerkezetet egy Microsoft Excel munkafüzetbe listázza ki, a hierarchiának megfelelően. A mappák és állományok feltérképezésekor megadhatjuk, hogy történjen-e keresés az alkönyvtárakban is, illetve a találati listában csak milyen kiterjesztésű állományok szerepeljenek.
Komponens elkészítése
A komponenst elegendő feldobnunk a Form-ra, és beállítani a megfelelő property-ket. A property-k megadása után meg kell hívnunk az Execute metódust, és a könyvtárszerkezet listázásra kerül a megadott elérési útvonalon belül. A komponens property-jeinek listája a következő:
  • Active: megadható, hogy a keresés folytatódjon-e vagy sem abban az esetben, ha az éppen zajlik. Inaktív állapotban ez a tulajdonság nem szignifikáns. Amennyiben a keresés folyamán ennek értékét FALSE-ra állítjuk, akkor a keresés a legrövidebb időn belül megszakad, és az addig felderített útvonal elemei kerülnek listázásra.
  • ScanPath: megadható az a mappa-elérési útvonal, melynek tartalma listázásra, majd megjelenítésre kerül. Ha a megadott mappa nem létezik, akkor a legelső fix meghajtó gyökere lesz a kiindulási mappa.
  • SearchSub: megadható, hogy a megadott elérési útvonal almappáiban is történjen keresés. Amennyiben értéke FALSE, akkor csak a mappa gyökerében található elemek listázódnak ki.
  • Extensions: egy tömbben megadhatók azok a kiterjesztések, melyekre szűkítés történik, vagyis csak a megadott kiterjesztéssel rendelkező állományok listázása történik meg a mappákon belül.
A komponens egy eseményt definiál az öröklötteken túl. Ennek neve ScanEvent, mely akkor zajlik le, ha egy mappa, vagy egy fájl kiírása megtörténik. Ennek segítségével a hívóalkalmazásban folyamatjelzést is tudunk alkalmazni.
A komponens metódusai a következők:
  • GetFirstFixed: amikor a megadott elérési útvonal nem létezik, a metódus keresi meg a legelső elérhető merevlemez betűjelét. A visszatérési értéke egy karakterlánc, például „C:\”.
  • IsExists: a metódusban vizsgáljuk a megadott elérési útvonal létezését.
  • Execute: a metódus hívásakor történik meg a listázás és a kiírás egy Excel munkafüzetbe.
  • ScanDirectory: a művelet oroszlánrészét végzi ez a metódus. A végrehajtás tulajdonképpen egy rekurzív keresés a megadott elérési útvonalon, mely állandóan ellenőrzi, hogy az Active property értéke igaz vagy sem. Hamis érték esetén a listázás megszakad.
Az Execute metódusban a következő lépéseket tesszük: első lépésben létrehozzuk a kapcsolatot az Excel alkalmazással, valamint létrehozunk egy WorkBook és egy WorkSheet objektumot.
ea = new Excel.ApplicationClass();
Excel.Workbook ew = ea.Workbooks.Add(m);
ws = (Excel.Worksheet)ea.Worksheets[1];
Kiírjuk a megadott elérési útvonalat a munkafüzet első cellájába, majd elindítjuk a listázást.
ws.Cells[1,1] = path;
...
ScanDirectory(path,1);
A ScanDirectory metódus első paramétere a megadott elérési út, míg a második paraméter az aktuális oszlopszám, ahová a bejegyzés kerül a munkafüzetben. A hierarchikus elrendezés érdekében a könyvtárak, és az abban található elemek neveit mindig egy oszloppal hátrébb kezdjük kiírni.
A ScanDirectory metódus elején lekérdezzük a megadott mappa alkönyvtárait, majd a fájlok neveit attól függően, hogy adtunk-e meg szűkítő kritériumokat (kiterjesztéseket).
A következő lépésben végigmegyünk a mappák nevein, és minden mappa nevét kiírjuk vastag betűkkel egy-egy cellába, majd léptetünk egyet a sorszámon.
foreach (DirectoryInfo dinfo in directoryList)
{
  if (dinfo.Name[0].ToString() != ".")
  {
    ws.Cells[row,column] = dinfo.Name;
    Excel.Range er = (Excel.Range)ws.Cells[row,column];
    er.Font.Bold = true;
    row++;
  ...
Amennyiben igazra állítottuk a SearchSub property értékét, akkor hívjuk meg rekurzív módon a függvényt újra.
  if (searchsub)
  {
    ScanDirectory(dinfo.FullName,column+1);
  }
}
A fájlok listázása is azonos elven működik.
foreach (object finfo in files)
{
  FileInfo fi = (FileInfo)finfo;
  ws.Cells[row,column] = fi.Name;          
  row++;
  ...
Kliensalkalmazás elkészítése
A hívóalkalmazásban elegendő a szövegmezőben megadni a keresési útvonalat, bejelölni, hogy történjen-e keresés az almappákban is vagy sem, illetve amennyiben szükséges, megadni a szükséges kiterjesztéseket.
etComponent1.ScanPath = textBox1.Text;
etComponent1.SearchSub = checkBox1.Checked;
etComponent1.Execute();
A művelet a LISTÁZÁS feliratú gombra kattintva indítható. A LEÁLLÍTÁS feliratú gombra kattintáskor a művelet megszakad, és az addig kiírt információ megjelenik a munkafüzetben.