Как определить, является ли данная буква диска локальным, сопоставленным или USB-накопителем?

17

Учитывая букву диска, как я могу определить, какой тип диска это?

Например, E: \ является USB-накопителем, сетевым диском или локальным жестким диском.

    
задан Benjol 09.12.2010 в 10:28
источник
  • «Название говорит все» - нет, это не так. На каком языке вы работаете? Вам нужно обнаружить USB-накопитель, подключенный и т. Д. И т. Д. –  Jamiec 09.12.2010 в 10:32
  • @Jamiec - я думаю, в этом случае это было сделано. Посмотрите на его теги - C #, означает, что он использует C # .Net, .Net означает, что он использует Windows (скорее всего), и его заголовок вопроса ясно говорит, что он хочет знать, какой тип диска является буквой диска. Во всяком случае, я редактировал вопрос. –  GenericTypeTea 09.12.2010 в 10:36
  • @Jamiec, вопрос «обнаружение USB-накопителя, подключенного к компьютеру» уже был убит здесь, на SO;) –  Benjol 09.12.2010 в 10:44

5 ответов

31

Посмотрите DriveInfo 's DriveType .

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;
    }
}
    
ответ дан GenericTypeTea 09.12.2010 в 10:34
  • Спасибо, только что мне нужно было указать мне в правильном направлении. –  Benjol 09.12.2010 в 10:45
  • Это именно то, что мне нужно для моего проекта! Спасибо ! –  Shinichi 20.03.2014 в 03:03
  • Это не будет работать всегда (главным образом для внешних жестких дисков). Попробуйте увидеть, является ли тип интерфейса USB. –  Vishwaram Sankaran 19.06.2015 в 09:10
6

Просто для справки для кого-то еще, это то, на что я ответил 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;
}

(Возможно, вы также захотите обратить внимание на ответ AJBauer : DriveInfo также отобразит USB HD как DriveType .fixed )

    
ответ дан Benjol 09.12.2010 в 11:22
  • Хороший пример, но я бы изменил строку на path.StartsWith (i.Name, StringComparison.OrdinalIgnoreCase), чтобы он не чувствителен к регистру. –  DeCaf 26.06.2012 в 16:12
  • @DeCaf, только что заметил ваш комментарий, спасибо! –  Benjol 18.01.2013 в 08:32
  • @vlax, спасибо, извините, что он был отклонен ... –  Benjol 15.03.2013 в 15:32
3

DriveInfo также будет перечислять USB HD как 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: диски и файловые системы

    
ответ дан A.J.Bauer 30.01.2014 в 16:41
2

Посмотрите DriveInfo и DriveType     

ответ дан Adriaan Stander 09.12.2010 в 10:34
0

DriveType показывает SUBSTed диски также как DriveType.Fixed .

Чтобы проверить, подключен ли диск, я использую код Как определить, был ли путь к каталогу SUBST'd .     

ответ дан boboes 17.05.2016 в 16:18