当前位置:首页 > 行业动态 > 正文

如何用C检测移动硬盘并获取其盘符?

在C#中可通过DriveInfo.GetDrives()遍历驱动器,筛选DriveType为Removable且IsReady状态的磁盘,通过Name属性获取盘符,需排除非移动设备,结合WMI或设备状态检测提升识别精度。

在C#中检测移动硬盘并获取其盘符,可以通过System.IO命名空间中的DriveInfo类实现,以下是详细实现步骤及代码示例,涵盖核心逻辑、异常处理和实时监测功能,帮助开发者快速集成到项目中。


实现原理

Windows系统将移动硬盘(通过USB连接的存储设备)标记为可移动驱动器固定驱动器(取决于设备类型),通过DriveInfoDriveType属性,可筛选出移动存储设备并提取盘符信息。


核心代码实现

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();
    }
}

注意事项

  1. 权限要求:程序需以管理员权限运行,否则可能无法访问某些驱动器。
  2. 驱动器未就绪:访问TotalSizeVolumeLabel前需检查IsReady属性,避免抛出异常。
  3. 设备类型误判:部分移动硬盘可能被识别为DriveType.Fixed(固定磁盘),需结合其他条件(如接口类型)进一步验证。
  4. 跨平台兼容性:此代码仅适用于Windows系统,Linux/macOS需调用平台特定API。

引用说明

  • DriveInfo类文档:Microsoft Learn – DriveInfo
  • ManagementEventWatcher监听事件:WMI Queries for Storage Devices
  • DriveType枚举定义:DriveType Enumeration
0