C# - Meghajtó-információk lekérdezése

forráskód letöltése
A Windows rendszer dinamikus könyvtáraiban számtalan metódust találunk, melyek hasznosan egészítik ki a .NET Framework osztályaiban fellelhető függvényeket és property-ket. Ezek közé tartoznak a meghajtók adatainak elérését lehetővé tevő metódusok. Cikkünkben bemutatunk ezek közül néhányat, melyekkel a megadott meghajtó méretére, típusára vonatkozó információk kérdezhetők le.
A mellékelt példában három API metódus használatát mutatjuk be, melyek segítségével információkat kaphatunk a számítógép tetszőleges meghajtójáról. A projektünk tartalmaz egy Win32 nevű osztályt, mely tartalmazza a metódusok menedzselt deklarációit.
GetDriveType metódus
Deklarációja az osztályban a következő:
[DllImport("kernel32")]
public static extern DriveType GetDriveType(string path);
A metódus paramétere a lekérdezendő meghajtó betűjele. A metódus eredetileg egy egész szám formájában adja vissza, hogy a meghajtó milyen típusú. A lehetséges visszatérési értékeket egy felsorolt típusba rendeztük.
public enum DriveType : int
{
  DRIVE_NO_ROOT = 1,     
  DRIVE_REMOVABLE = 2,
  DRIVE_FIXED = 3,
  DRIVE_REMOTE = 4,
  DRIVE_CDROM = 5
}
A mellékelt példa felületén található ComboBox kontrolok tartalmát feltöltjük a számítógépen található meghajtók betűjeleivel. A kiválasztott elemmel meghívjuk a GetDriveType metódust, majd kiértékeljük az eredményt. Mindezt a CollectDrives metódusban tesszük meg.
GetDiskFreeSpaceEx metódus
A függvény segítségével lekérdezhetjük a megadott meghajtó területfoglaltsági adatait. A deklarációja a következő a Win32 osztályunkban:
[DllImport("kernel32")]
public static extern bool GetDiskFreeSpaceEx(string path,ref Int64 freeAvailable,ref Int64 capacity,ref Int64 totalFree);
A paraméterek:
  • path: a lekérdezendő meghajtó betűjele (például ’C:\’).
  • freeAvailable: szabad lemezterület mérete bájtban, mely a hívó szál számára elérhető. Lehet NULL értékű.
  • capacity: a meghajtó teljes lemezterülete bájtban.
  • totalFree: a lemezterület szabad területe bájtban, mely lehet NULL értékű.
GetVolumeInformation metódus
A metódus deklarációja:
[DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
public static extern bool GetVolumeInformation
(
  string rootPathName,
  [Out] StringBuilder volNameBuffer,
  int nameSize,
  out int serialNumber,
  out int maxComponentLength,
  out int fileSystemFlags,
  [Out] StringBuilder fileSystemName,
  int fileSystemNameSize
);
A metódus segítségével információkat kaphatunk az adott meghajtó címkéjéről, fájlrendszeréről, szériaszámáról, valamint arról, hogy milyen hosszú neveket választhatunk egy-egy objektum (például fájl vagy mappa) létrehozásakor. Ennek érdekében első paraméterben meg kell adni a meghajtó betűjelét, majd az OUT módú paramétereket értelmeznünk kell.
A címke és a fájlrendszer neve egyaránt StringBuilder típusú objektum, melyeket speciálisan deklaráltunk, és amelyek anélkül fogják tartalmazni a szöveges információkat, hogy a metódus hívásakor el kellene látnunk őket az OUT prefixummal.
StringBuilder volname  = new StringBuilder(260);
StringBuilder fsystemname = new StringBuilder(260);
...
Win32.GetVolumeInformation(drive,volname,volname.Capacity,out serialnumber,out complength,out sysflag,fsystemname,fsystemname.Capacity);
...