日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

c# 获取路径的盘符_c#获取驱动器盘符

發布時間:2024/7/23 C# 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c# 获取路径的盘符_c#获取驱动器盘符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在編寫某些Windows管理應用程序時,能夠從自定義的驅動器選擇列表框中進行選擇無疑是非常專業的,使用Delphi或者C++的早期版本時我們都必須使用Win32所提供的許多關于獲取磁盤信息的API函數來分別獲取像卷標、序列號以及剩余空間等信息,現在我們將使用.Net框架和WMI(Windows Management Instrumentation - Windows 管理規范 )來實現上述功能。

一、 簡介

若僅簡單獲取邏輯驅動器的名稱列表我們使用.Net框架的Environment.GetLogicalDrives即可,但是若想獲得更多關于磁盤驅動器的信息我們可以使用.Net框架下的System.Management 命名空間所提供的類和委托等對大量管理信息和管理事件的集合進行訪問,這些信息和事件都與 WMI有關,該命名空間下的類實際上也是對WMI的一種封裝,應用程序和服務可以使用從 ManagementObjectSearcher 和 ManagementQuery 派生的類,查詢感興趣的管理信息,例如在磁盤上還剩多少可用空間、當前 CPU 利用率是多少、某一應用程序正連接到哪一數據庫等等,現在我們就以 C# 語言編寫獲取詳細的邏輯驅動器信息的示例來展示.Net框架System.Management 命名空間的相關類和WMI編程,如下圖:

二、技術要點

WMI最初是內置在 Windows 2000、Windows XP 和 Windows Server 2003 系列操作系統中核心的管理支持技術,目前WMI 已經是一種規范和基礎結構,通過它可以訪問、配置、管理和監視幾乎所有的 Windows 資源例如磁盤、事件日志、文件、文件夾、文件系統、網絡組件、操作系統設置、性能數據、打印機、進程、注冊表設置、安全性、服務、共享、用戶、組等等。在 WMI 之前,能夠以編程方式訪問 Windows 資源的惟一方法就是通過 Win32 API,現在我們除了使用WMI 腳本管理任何通過 WMI 公開的 Windows 資源外,還可以通過.Net框架對于WMI封裝的System.Management 命名空間來輕松實現。

我們首先使用WMI查詢來獲取特定類名的SelectQuery實例,可以有兩種方法創建該實例,一是可以傳遞一個已知的類名,譬如本文需要傳遞的類名為:Win32_LogicalDisk,代碼如下:

SelectQuery selectQuery = new SelectQuery("win32_logicaldisk");

或者使用wql查詢來創建查詢類的實例,代碼如下:

SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");

或者只獲取類的部分屬性,代碼如下:

SelectQuery selectQuery = new SelectQuery("select Name,DriveType from win32_logicaldisk");

WQL查詢語言是 SQL 的一個子集,查詢通過包含以下內容限制返回的數據量1、SELECT 子句,指定只返回某些屬性的數據;2、WHERE 子句,指定要返回的實例。Win32_LogicalDisk類在默認的本地MSDN里是無法找到的,只有在聯機的MSDN里,Win32 and COM Development下的WMI下才能找到,同樣可以使用的類還有很多很多,包含登錄用戶信息的Win32_Account類、包含本地和共享打印機信息的Win32_PrinterShare類等等。Win32_LogicalDisk里所包含的驅動器屬性相當豐富,如下圖:

然后使用該指定的SelectQuery查詢創建ManagementObjectSearcher實例,此類是用于檢索管理信息的較為常用的入口點之一,實例創建結束,我們需要調用Get方法執行查詢以便檢索管理對象的集合,當調用該方法時,ManagementObjectSearcher 在指定的范圍內執行給定的查詢,并返回與 ManagementObjectCollection 中的查詢匹配的管理對象的集合,這是就可以在一個循環中遍歷集合中的所有對象,并獲取我們所感興趣的對象的屬性,代碼如下:

……

SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");

ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);

int i=0;

foreach (ManagementObject disk in searcher.Get()) {

//獲取驅動器盤符

listView1.Items.Add(disk["Name"].ToString());

}

……

三、 程序實現

我們使用Visual Studio 2005來創建該示例程序,首先創建C#的Windows應用程序空白項目,為解決方案和項目取名為 GetLogicDrives,在默認的Form1窗體上我們各放置一個ListView和一個Button控件,保留控件的默認名稱不變,將ListView1的View屬性設為Details,雙擊ListView1的Columns屬性,為詳細信息視圖添加5個列,分別為:盤符、卷標、類型、容量和可用空間,設置Button1的Text屬性為Refresh,為該Button1添加單擊事件,代碼如下:

private void button1_Click(object sender, EventArgs e)

{

listView1.Items.Clear();

SelectQuery selectQuery = new SelectQuery("select * from win32_logicaldisk");

ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);

int i=0;

foreach (ManagementObject disk in searcher.Get()) {

//盤符

listView1.Items.Add(disk["Name"].ToString());

//卷標

try

{

listView1.Items[i].SubItems.Add(disk["VolumeName"].ToString());

}

catch

{

listView1.Items[i].SubItems.Add("設備未準備好");

}

//驅動器類型

string DriveType;

try

{

DriveType = disk["DriveType"].ToString();

switch (DriveType)

{

case "0":

listView1.Items[i].SubItems.Add("未知設備");

break;

case "1":

listView1.Items[i].SubItems.Add("未分區");

break;

case "2":

listView1.Items[i].SubItems.Add("可移動磁盤");

break;

case "3":

listView1.Items[i].SubItems.Add("硬盤");

break;

case "4":

listView1.Items[i].SubItems.Add("網絡驅動器");

break;

case "5":

listView1.Items[i].SubItems.Add("光驅");

break;

case "6":

listView1.Items[i].SubItems.Add("內存磁盤");

break;

}

}

catch

{

listView1.Items[i].SubItems.Add("未知類型");

}

//容量

try

{

listView1.Items[i].SubItems.Add(GetSizeUseUnit(disk["Size"].ToString()));

}

catch

{

listView1.Items[i].SubItems.Add("設備未準備好");

}

//剩余空間

try

{

listView1.Items[i].SubItems.Add(GetSizeUseUnit(disk["FreeSpace"].ToString()));

}

catch

{

listView1.Items[i].SubItems.Add("設備未準備好");

}

i++;

}

}

我們使用了格式化顯示磁盤空間容量的自定義函數GetSizeUseUnit,當不使用該函數時磁盤容量和可用空間的顯示如下:

private string GetSizeUseUnit(string size)

{

double dSpace = Convert.ToDouble(size);

string sSpace = dSpace.ToString("N");

string[] tmp;

string rtnSize = "0";

tmp = sSpace.Split(',');

switch (tmp.GetUpperBound(0))

{

case 0:

rtnSize = tmp[0] + " 字節";

break;

case 1:

rtnSize = tmp[0] + "." + tmp[1].Substring(0,2) + " K";

break;

case 2:

rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " M";

break;

case 3:

rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " G";

break;

case 4:

rtnSize = tmp[0] + "." + tmp[1].Substring(0, 2) + " T";

break;

}

return rtnSize;

}

使用了上述自定義格式化顯示的函數后,磁盤容量和可用空間的顯示就顯得非常簡潔和直觀。

最后,為了確保在窗體啟動時自動獲取驅動器信息,需要在窗體的Load事件中模擬對Button1的單擊操作,代碼如下:

private void Form1_Load(object sender, EventArgs e)

{

button1_Click(sender, e);

}

四、 總結

我們利用.Net框架System.Management 命名空間所提供的WMI封裝非常簡單的實現了獲取邏輯驅動器的詳細信息,除了上述信息我們還可以輕松的獲取Windows資源大部分信息,比起使用Win32API要更加簡單和有效。該示例程序在Windows XP SP2 + Visual Studio 2005 下編譯和調試通過。

總結

以上是生活随笔為你收集整理的c# 获取路径的盘符_c#获取驱动器盘符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。