2016-04-25 37 views
4

我写了一个c#程序来查找新插入的USB驱动器和它的驱动器号。现在,当我运行这个程序时,我得到了插入事件并且无法得到驱动器盘符。任何人都可以建议我做一个想法吗?如何在c#中新插入USB驱动器号?

代码

static void Main(string[] args) 
{ 
    ManagementEventWatcher mwe_creation; //Object creation for 'ManagementEventWatcher' class is used to listen the temporary system event notofications based on specific query. 
    WqlEventQuery q_creation = new WqlEventQuery(); //Represents WMI(Windows Management Instrumentation) event query in WQL format for more information goto www.en.wikipedia.org/wiki/WQL 
    q_creation.EventClassName = "__InstanceCreationEvent";// Sets the eventclass to the query 
    q_creation.WithinInterval = new TimeSpan(0, 0, 2); // Setting up the time interval for the event check(here, it is 2 Seconds) 
    q_creation.Condition = @"TargetInstance ISA 'Win32_DiskDriveToDiskPartition'"; //Sets which kind of event to be notified 
    mwe_creation = new ManagementEventWatcher(q_creation); //Initializing new instance 
    mwe_creation.EventArrived += new EventArrivedEventHandler(USBEventArrived_Creation);//Calling up 'USBEventArrived_Creation' method when the usb storage plug-in event occured 
    mwe_creation.Start(); // Starting to listen to the system events based on the given query 
    while (true) ; 

} 
static void USBEventArrived_Creation(object sender, EventArrivedEventArgs e){ 

    Console.WriteLine("USB PLUGGED IN!"); 
    ManagementBaseObject instance = (ManagementBaseObject)e.NewEvent["TargetInstance"]; 
    foreach (var property in instance.Properties) 
    { 

     if (property.Name == "Name") 
      Console.WriteLine(property.Name + " = " + property.Value); 
    } 

} 
+0

你尝试过这种无功机= DriveInfo.GetDrives() 。凡(驱动=> drive.IsReady && drive.DriveType == DriveType.Removable); – rashfmnb

+0

这将挑选目前在系统中的所有可移动驱动器 –

+0

看看这个satckoverflow链接它有太多的信息http://stackoverflow.com/questions/6003822/how-to-detect-a-usb-drive-已被插入 – rashfmnb

回答

0

你可能工作太累重新预先存在的soultion。下面是Stephen Mcohn作出了公开的许可项目,提供正是你需要的界面,似乎是有据可查:

http://www.codeproject.com/Articles/63878/Enumerate-and-Auto-Detect-USB-Drives

下面是他如何过滤只是USB驱动器

new ManagementObjectSearcher(
     "select DeviceID, Model from Win32_DiskDrive " + 
     "where InterfaceType='USB'").Get()) 

这是如何恢复特定的驱动器号

获取特定驱动器使用Associators来完成信件以获得Win32_LogicalDisk,然后可以给出设备ID(例如,驱动器号)。

微软提供了一个VB代码示例,您可以端口,如果你不想只是导入斯蒂芬整个模块:

ComputerName = "." 
Set wmiServices = GetObject (_ 
    "winmgmts:{impersonationLevel=Impersonate}!//" & ComputerName) 
' Get physical disk drive 
Set wmiDiskDrives = wmiServices.ExecQuery ("SELECT Caption, DeviceID FROM Win32_DiskDrive") 

For Each wmiDiskDrive In wmiDiskDrives 
    WScript.Echo "Disk drive Caption: " & wmiDiskDrive.Caption & VbNewLine & "DeviceID: " & " (" & wmiDiskDrive.DeviceID & ")" 

    'Use the disk drive device id to 
    ' find associated partition 
    query = "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" _ 
     & wmiDiskDrive.DeviceID & "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition"  
    Set wmiDiskPartitions = wmiServices.ExecQuery(query) 

    For Each wmiDiskPartition In wmiDiskPartitions 
     'Use partition device id to find logical disk 
     Set wmiLogicalDisks = wmiServices.ExecQuery _ 
      ("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" _ 
      & wmiDiskPartition.DeviceID & "'} WHERE AssocClass = Win32_LogicalDiskToPartition") 

     For Each wmiLogicalDisk In wmiLogicalDisks 
      WScript.Echo "Drive letter associated" _ 
       & " with disk drive = " _ 
       & wmiDiskDrive.Caption _ 
       & wmiDiskDrive.DeviceID _ 
       & VbNewLine & " Partition = " _ 
       & wmiDiskPartition.DeviceID _ 
       & VbNewLine & " is " _ 
       & wmiLogicalDisk.DeviceID 
     Next  
    Next 
Next 
相关问题