上一篇
如何用C检测移动硬盘并获取其盘符?
- 行业动态
- 2025-05-14
- 1
在C#中可通过DriveInfo.GetDrives()遍历驱动器,筛选DriveType为Removable且IsReady状态的磁盘,通过Name属性获取盘符,需排除非移动设备,结合WMI或设备状态检测提升识别精度。
在C#中检测移动硬盘并获取其盘符,可以通过System.IO
命名空间中的DriveInfo
类实现,以下是详细实现步骤及代码示例,涵盖核心逻辑、异常处理和实时监测功能,帮助开发者快速集成到项目中。
实现原理
Windows系统将移动硬盘(通过USB连接的存储设备)标记为可移动驱动器或固定驱动器(取决于设备类型),通过DriveInfo
的DriveType
属性,可筛选出移动存储设备并提取盘符信息。
核心代码实现
using System; using System.IO; using System.Management; public class UsbDriveDetector { public static void DetectUsbDrives() { try { // 获取所有逻辑驱动器 DriveInfo[] drives = DriveInfo.GetDrives(); foreach (DriveInfo drive in drives) { try { // 筛选可移动驱动器或固定驱动器(兼容移动硬盘) if ((drive.DriveType == DriveType.Removable || drive.DriveType == DriveType.Fixed) && drive.IsReady) { Console.WriteLine($"发现移动存储设备:{drive.Name}"); Console.WriteLine($"卷标:{drive.VolumeLabel}"); Console.WriteLine($"总容量:{drive.TotalSize / (1024.0 * 1024 * 1024):F2} GB"); Console.WriteLine($"可用空间:{drive.AvailableFreeSpace / (1024.0 * 1024 * 1024):F2} GBn"); } } catch (Exception ex) { // 处理驱动器不可访问的情况(例如未插入介质的光驱) Console.WriteLine($"读取驱动器 {drive.Name} 失败:{ex.Message}"); } } } catch (Exception globalEx) { Console.WriteLine($"全局错误:{globalEx.Message}"); } } }
实时监测移动硬盘插拔
通过ManagementEventWatcher
监听系统事件,实现设备插拔的实时响应:
public class UsbDriveMonitor { public static void StartMonitoring() { // 监听USB设备插入事件 var insertQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 2"); var insertWatcher = new ManagementEventWatcher(insertQuery); insertWatcher.EventArrived += (sender, e) => { Console.WriteLine("检测到新设备插入,正在扫描移动硬盘..."); DetectUsbDrives(); // 调用检测方法 }; insertWatcher.Start(); // 监听USB设备拔出事件 var removeQuery = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent WHERE EventType = 3"); var removeWatcher = new ManagementEventWatcher(removeQuery); removeWatcher.EventArrived += (sender, e) => { Console.WriteLine("设备已移除,更新驱动器列表..."); DetectUsbDrives(); }; removeWatcher.Start(); } }
注意事项
- 权限要求:程序需以管理员权限运行,否则可能无法访问某些驱动器。
- 驱动器未就绪:访问
TotalSize
或VolumeLabel
前需检查IsReady
属性,避免抛出异常。 - 设备类型误判:部分移动硬盘可能被识别为
DriveType.Fixed
(固定磁盘),需结合其他条件(如接口类型)进一步验证。 - 跨平台兼容性:此代码仅适用于Windows系统,Linux/macOS需调用平台特定API。
引用说明
DriveInfo
类文档:Microsoft Learn – DriveInfoManagementEventWatcher
监听事件:WMI Queries for Storage Devices- DriveType枚举定义:DriveType Enumeration