如何确定给定的驱动器字母是本地驱动器、映射驱动器还是USB驱动器?

22

如何确定驱动器类型?比如,怎样知道 E:\ 是USB驱动器、网络驱动器还是本地硬盘驱动器。


1
标题并没有说明问题。你使用的是什么编程语言/操作系统?你需要检测插入USB驱动器等等。 - Jamiec
3
@Jamiec - 我认为在这种情况下它确实有用。看看他的标签 - C#,意味着他正在使用C#.Net,.Net表示他正在使用Windows(很可能),而他的问题标题明确说明了他想知道驱动器字母是什么类型的。无论如何,我编辑了这个问题。 - djdd87
2
@Jamiec,"检测USB驱动器插入"这个问题已经在SO上被讨论过很多次啦 ;) - Benjol
5个回答

43

请查看DriveInfoDriveType属性。

System.IO.DriveInfo[] drives = System.IO.DriveInfo.GetDrives();
foreach (var drive in drives)
{
    string driveName = drive.Name; // C:\, E:\, etc:\

    System.IO.DriveType driveType = drive.DriveType;
    switch (driveType)
    {
        case System.IO.DriveType.CDRom:
            break;
        case System.IO.DriveType.Fixed:
            // Local Drive
            break;
        case System.IO.DriveType.Network:
            // Mapped Drive
            break;
        case System.IO.DriveType.NoRootDirectory:
            break;
        case System.IO.DriveType.Ram:
            break;
        case System.IO.DriveType.Removable:
            // Usually a USB Drive
            break;
        case System.IO.DriveType.Unknown:
            break;
    }
}

谢谢,这正是我需要的,可以指引我朝着正确的方向前进。 - Benjol
1
这正是我项目所需要的!非常感谢! - Shinichi
这并不总是有效(大多数情况下适用于外置硬盘)。尝试查看接口类型是否为USB。 - Vishwaram Sankaran
目前USB驱动器也是固定的。 - Vonkel.

10

仅供参考,这是我将GenericTypeTea的回答转化成的内容:

/// <summary>
/// Gets the drive type of the given path.
/// </summary>
/// <param name="path">The path.</param>
/// <returns>DriveType of path</returns>
public static DriveType GetPathDriveType(string path)
{
    //OK, so UNC paths aren't 'drives', but this is still handy
    if(path.StartsWith(@"\\")) return DriveType.Network;  
    var info = 
          DriveInfo.GetDrives()
          Where(i => path.StartsWith(i.Name, StringComparison.OrdinalIgnoreCase))
          FirstOrDefault();
    if(info == null) return DriveType.Unknown;
    return info.DriveType;
}

您可能还需要注意A.J.Bauer的answerDriveInfo也将USB硬盘列为DriveType.fixed


不错的示例,但我会修改这一行为 path.StartsWith(i.Name, StringComparison.OrdinalIgnoreCase),这样它就不区分大小写了。 - DeCaf

7
DriveInfo也会将USB硬盘列为DriveType.fixed,因此如果您需要知道驱动器的接口是否为USB,则无法帮助。这里是一个VB.NET函数,可以返回所有外部USB驱动器的字母:
Imports System.Management

Public Shared Function GetExternalUSBDriveLettersCommaSeparated() As String
    Dim usbDrivesString As String = ""

    Dim wmiDiskDriveDeviceID As String = ""
    Dim wmiDiskDriveMediaType As String = ""
    Dim wmiDiskPartitionDeviceID As String = ""
    Dim wmiLogicalDiskDeviceID As String = ""

    Using wmiDiskDrives = New ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE InterfaceType='USB'")
        For Each wmiDiskDrive As ManagementObject In wmiDiskDrives.Get
            wmiDiskDriveDeviceID = wmiDiskDrive("DeviceID").ToString
            wmiDiskDriveMediaType = wmiDiskDrive("MediaType").ToString.ToLower
            If wmiDiskDriveMediaType.Contains("external") Then
                Using wmiDiskPartitions = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskDrive.DeviceID='" + wmiDiskDriveDeviceID + "'} WHERE AssocClass = Win32_DiskDriveToDiskPartition")
                    For Each wmiDiskPartition As ManagementObject In wmiDiskPartitions.Get
                        wmiDiskPartitionDeviceID = wmiDiskPartition("DeviceID").ToString
                        Using wmiLogicalDisks = New ManagementObjectSearcher("ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" + wmiDiskPartitionDeviceID + "'} WHERE AssocClass = Win32_LogicalDiskToPartition")
                            For Each wmiLogicalDisk As ManagementObject In wmiLogicalDisks.Get
                                wmiLogicalDiskDeviceID = wmiLogicalDisk("DeviceID").ToString
                                If usbDrivesString = "" Then
                                    usbDrivesString = wmiLogicalDiskDeviceID
                                Else
                                    usbDrivesString += "," + wmiLogicalDiskDeviceID
                                End If
                            Next
                        End Using
                    Next
                End Using
            End If
        Next
    End Using

    Return usbDrivesString
End Function

请查看此MSDN链接:WMI任务:磁盘和文件系统

1

DriveType会将SUBSTed驱动器显示为DriveType.Fixed

QueryDosDevice可用于获取数据。

   using System.Runtime.InteropServices;

   [DllImport("kernel32.dll", SetLastError=true)]
   static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);

这里有一个完整的解决方案:如何确定目录路径是否被SUBST'd

0

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