C# - Web szerverünk háttértárainak ellenőrzése interneten keresztül

FileSystemObject objektum használata

forráskód letöltése
A feladatunk a következő: készítsünk egy olyan web oldalt, melyet elhelyezve szerverünkön bárhonnan ellenőrizhetjük, hogy a szerver háttértárain mennyi még a szabadhely. Így bármerre is járjunk a nagyvilágban, ha adott egy internet kapcsolat, akkor máris megtudhatjuk szerverünk aktuális állapotát.
A megvalósításhoz a FileSystemObject objektumot használjuk fel, így ennek használatával is megismerkedhetünk a cikk végére. A háttértárak kapacitásán, rajtuk lévő szabad terület mennyiségén kívül olyan információkat is kaphatunk, mint például a winchester sorozatszáma, a fájl rendszer típusa, stb.
A mellékelt példa megnyitásához hozzon létre egy virtuális könyvtárat web szerverén FileSystemObj névvel és másolja be oda a mellékelt állományokat.
Ha prognramunkban a FileSystemObject-et szeretnénk használni, akkor némi előkészületre lesz szükségünk. Válasszuk a Project - Add Reference menüpontot, majd a megjelenő ablakban a COM lapon keressük elő a Microsoft Scripting Runtime elemet. Ha megvan, akkor Select és OK gomb. A programunk mostantól hivatkozhat a Scripting névtérre, melyben a szükséges objektumok kaptak helyet.
using Scripting;
A web oldalunkra tegyünk fel a Web Forms palettáról egy DataGrid kontrollt. Ebben fogjuk táblázatosan megjeleníteni az adott számítógépen elérhető meghajtókat és azok információit.
A megjelenítési kép összeállítására, vagyis a DataGrid feltöltésére a Page_Load eseményben kerül sor, így mire a web oldal megjelenik, az már tartalmaz minden szükséges információt.
private void Page_Load(object sender, System.EventArgs e)
{
      if (!Page.IsPostBack) 
      {
        IDrive id;
        DataRow dr;
        DataTable dt = new DataTable();
        int i = 1;
        Int64 a = 0, b = 0, c = 0;
Létre kell tehát hoznunk egy új FileSystemObject objektumot.
        Scripting.FileSystemObject fso = new FileSystemObject();
Ez az objektum tartalmaz egy Drives property-t, melyen keresztül elérhető a rendszerben lévő összes meghajtó adata. Ahhoz, hogy ezen a „tömbön” végigmenjünk, szükség lesz egy IEnumerator interfészre, melyet a Drives property GetEnumerator függvénye szolgáltat.
        IEnumerator ie = fso.Drives.GetEnumerator();
Mielőtt tovább haladnánk, létrehozzuk a DataTable oszlopait. Mivel a DataGrid-hez most nem egy adatbázis egy adattábláját kapcsoljuk, így nekünk kell előállítani egy virtuális adattáblát. A DataTable osztály Columns property-jén keresztül elérhetjük az Add függvény-t, mellyel egy-egy új oszlopot vehetünk fel az adattáblánkba. Paraméterként egy DataColumn típusú objektumot vár, melyet szintén itt hozunk létre, megadva a mező nevét és típusát.
        dt.Columns.Add(new DataColumn("Number", typeof(string)));
        dt.Columns.Add(new DataColumn("Drive Letter", typeof(string)));
        dt.Columns.Add(new DataColumn("Volume Name", typeof(string)));
        dt.Columns.Add(new DataColumn("Share Name", typeof(string)));
        dt.Columns.Add(new DataColumn("Total Size", typeof(string)));
        dt.Columns.Add(new DataColumn("Available Space", typeof(string)));
        dt.Columns.Add(new DataColumn("Free Space", typeof(string)));
        dt.Columns.Add(new DataColumn("Drive Type", typeof(string)));
        dt.Columns.Add(new DataColumn("File System", typeof(string)));
        dt.Columns.Add(new DataColumn("Path", typeof(string)));
        dt.Columns.Add(new DataColumn("Root Folder Name", typeof(string)));
        dt.Columns.Add(new DataColumn("Serial Number", typeof(string)));
A mező szerkezet létrehozása után végigmehetünk a létező meghajtókon, melyhez a már lekért IEnumerator-t használjuk. Kezdeményezve egy while ciklust, a feltételében meghívhatjuk a MoveNext függvényét, mely mindig a következő elemre lépteti az IEnumerator-t és mivel ez logikai értéket ad vissza arra vonatkozóan, hogy van-e még elem vagy sem, így tökéletesen alkalmas arra, hogy while ciklusban alkalmazzuk. A MoveNext első hívása fogja csak az első elemre léptetni az IEnumerator-t.
        while (ie.MoveNext())
        {
Az IEnumerator Current property-n keresztül érhetjük el mindig az aktuális elemet object típusban. Mivel a FileSystemObject osztály Drives property-jére tekinthetünk úgy mint egy tömbbre, mely IDrive típusú elemeket tárol, így a Current property is egy ilyen objektumot ad vissza. Az IDrive osztály tárolja egy adott meghajtó összes paraméterét.
          id = (Scripting.IDrive)ie.Current;
A DataTable osztály NewRow függvényével létrehozunk egy új, üres sort az adattáblánkhoz. Visszatérési értékként egy DataRow típusú objektumot kapunk.
          dr = dt.NewRow();
A soron belüli egyes mezőket mint egy tömböt indexelve érhetjük a DataRow objektumunkon keresztül. Így az értékadás az adott sor mezőinek igen egyszerű feladat.
          dr[0] = i.ToString();
A IDrive DriveLetter property-jéből tudhatjuk meg a meghajtó betűjelét.
          dr[1] = id.DriveLetter + ":\\";
Ha az IDrive IsReady property-je igaz, akkor a meghajtó üzemkész állapotban van, ekkor tudjuk kiolvasni a többi jellemző adatát is. Ezt mindig ellenőriznünk kell, hiszen egy floppy, vagy CD esetén nem biztos, hogy van a meghajtóban lemez.
          if (id.IsReady)
          {
            dr[2] = id.VolumeName;
            dr[3] = id.ShareName;
            dr[4] = Int64.Parse(id.TotalSize.ToString()).ToString("n0");
            a = a + Int64.Parse(id.TotalSize.ToString());
            dr[5] = Int64.Parse(id.AvailableSpace.ToString()).ToString("n0");
            b = b + Int64.Parse(id.AvailableSpace.ToString());
            dr[6] = Int64.Parse(id.FreeSpace.ToString()).ToString("n0");
            c = c + Int64.Parse(id.FreeSpace.ToString());
            dr[7] = id.DriveType.ToString();
            dr[8] = id.FileSystem.ToString();
            dr[9] = id.Path;
            dr[10] = id.RootFolder.Name;
            dr[11] = id.SerialNumber.ToString("x8").ToUpper();
          }
Ha megvan az új sor, akkor azt a DataTable osztály Rows property-jének Add függvényével adhatjuk hozzá a táblánkhoz. Paraméterként az imént feltöltött DataRow osztályt kell átadni.
          dt.Rows.Add(dr);  
          i++;
        }
Menet közben készítettünk egy összesítést a tárterületről és szabadhelyről, így ezt egy új sorban megjelenítjük a táblázat végén.
        dr = dt.NewRow();
        dr[0] = "Total";
        dr[4] = a.ToString("n0");
        dr[5] = b.ToString("n0");
        dr[6] = c.ToString("n0");
        dt.Rows.Add(dr);
Végezetül már csak annyi a dolgunk, hogy DataGrid-hez kössük a megjelenítendő adattáblánkat.
        DataGrid1.DataSource = new DataView(dt);
        DataGrid1.DataBind();
        DataGrid1.HeaderStyle.CssClass = "f9b";        
      }      
  }