如何找到USB驱动器的盘符?

14

我正在编写一个安装程序,将应用程序安装到USB驱动器上。该应用程序仅可从USB驱动器中使用,因此通过自动选择要安装到的USB驱动器,可以为用户节省额外的步骤。

我可能会尝试使用Nullsoft或MSI进行安装,但由于我对.NET更熟悉,因此我最初计划尝试使用自定义.NET安装程序或.NET上的安装组件。

在Windows上使用.NET是否可以确定USB闪存驱动器的驱动器号?如何确定?


程序本身是从闪存驱动器运行的吗?还是你只是想说“嘿,这是系统上的驱动器,这些是闪存驱动器”? - Tom Kidd
3个回答

18

您可以使用:

from driveInfo in DriveInfo.GetDrives()
where driveInfo.DriveType == DriveType.Removable && driveInfo.IsReady
select driveInfo.RootDirectory.FullName

也可以获取FireWire驱动器,但实际上这可能是正确的做法。 - MSalters
1
但不返回USB硬盘,我认为这是一个问题。 - Ivan Ičin
一个USB硬盘并不完全是一个“USB闪存驱动器”,或者说它是吗?;-) - EricSchaefer

15

以下代码不使用 LINQ,但仍然使用 WMI 枚举系统上的所有驱动器:

// browse all USB WMI physical disks

foreach(ManagementObject drive in new ManagementObjectSearcher(
    "select * from Win32_DiskDrive where InterfaceType='USB'").Get())
{
    // associate physical disks with partitions

    foreach(ManagementObject partition in new ManagementObjectSearcher(
        "ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + drive["DeviceID"]
          + "'} WHERE AssocClass = 
                Win32_DiskDriveToDiskPartition").Get())
    {
        Console.WriteLine("Partition=" + partition["Name"]);

        // associate partitions with logical disks (drive letter volumes)

        foreach(ManagementObject disk in new ManagementObjectSearcher(
            "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='"
              + partition["DeviceID"]
              + "'} WHERE AssocClass =
                Win32_LogicalDiskToPartition").Get())
        {
            Console.WriteLine("Disk=" + disk["Name"]);
        }
    }

    // this may display nothing if the physical disk

    // does not have a hardware serial number

    Console.WriteLine("Serial="
     + new ManagementObject("Win32_PhysicalMedia.Tag='"
     + drive["DeviceID"] + "'")["SerialNumber"]);
}

源代码


ManagementObject、ManagementObjectSearcher和ManagementObjectCollection(通过.Get()隐式检索)都有一个应该被调用的Dispose方法。 - Wouter
1
我使用了您的解决方案来查找一个我知道序列号的单个闪存驱动器的驱动器字母。在Windows 10下它运行良好,但在Windows 7下序列号为空。我发现序列号也是drive["PNPDeviceID"]的一部分,现在我测试它是否包含我要查找的序列号。谢谢! - Florian Straub

15

C# 2.0版本的Kent代码(从我的记忆中,未经测试):

IList<String> fullNames = new List<String>();
foreach (DriveInfo driveInfo in DriveInfo.GetDrives()) {
    if (driveInfo.DriveType == DriveType.Removable) {
        fullNames.Add(driveInfo.RootDirectory.FullName);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接