Какому из физических HDD принадлежит логический диск? - VB

Узнай цену своей работы

Формулировка задачи:

Количество жёстких дисков от 2-х. Как

без WMI

(если отключён),

без FSO

и без Left$(App.Path, 3) определить сопоставления логических дисков физическим, пользуясь API?

Решение задачи: «Какому из физических HDD принадлежит логический диск?»

textual
Листинг программы
  1. Public Function MappingSearch(a$)
  2.    Dim Ret As Long                  'длина полезной информации от GetLogicalDriveStrings
  3.   Dim DrivesString As String * 255 'здесь будут данные от GetLogicalDriveStrings
  4.   Dim AllDrives$                 'общая строка для всех логич. дисков из функции GetLogicalDriveStrings
  5.   Dim Tmp$                       'хранит букву диска в формате "A:" или "C:"
  6.   Dim DeviceHandle As Long       'дескриптор объекта
  7.   Dim i As Long                  'для счёта дисков
  8.   Dim CountBytesReturned As Long 'сколько байт вернула функция DeviceIoControl
  9.   Dim OutBuffer(64) As Byte      'массив для хранения выданных от DeviceIoControl данных
  10.   Dim DriveCount As Long         'кол-во логич. дисков после разбора строки AllDrives$
  11.   Dim start As Long
  12.    Dim NameDiskPos As Long
  13.    
  14.    
  15.    Ret = GetLogicalDriveStrings(Len(DrivesString), DrivesString)
  16.    AllDrives$ = Left(DrivesString, Ret)
  17.  
  18.    'отображаем все логические диски на компьютере
  19.   start = 1        'стартовая позиция сканирования в InStr
  20.   For i = 1 To Len(AllDrives$)
  21.       NameDiskPos = InStr(start, AllDrives$, ":")
  22.       If (NameDiskPos <> 0) Then
  23.          inc DriveCount     'плюсуем 1 к логическим дискам
  24.       Else
  25.          Exit For
  26.       End If
  27.       start = NameDiskPos + 1
  28.    Next
  29.    
  30.    'в массиве столько элементов, сколько нашли логических дисков
  31.   '-1 из-за Option Base 0
  32.   ReDim Arr(DriveCount - 1)
  33.    
  34.    i = 0     'будем считать диски
  35.  
  36.    While (AllDrives$ <> vbNullString)
  37.      
  38.       Tmp$ = Mid$(AllDrives$, 1, InStr(AllDrives$, vbNullChar) - 2)  'берём одну букву диска в виде "A:"
  39.      AllDrives$ = Mid$(AllDrives$, InStr(AllDrives$, vbNullChar) + 1)  'удаляем первые 3 символа из строки
  40.                        
  41.       'берём хэндл объекта, в данном случае это диск
  42.      DeviceHandle = CreateFile("\\." & Tmp$, GENERIC_READ&, _
  43.                      FILE_SHARE_READ, _
  44.                      ByVal 0&, OPEN_EXISTING, 0, 0&)
  45.    
  46.       If (DeviceHandle = INVALID_HANDLE_VALUE) Then
  47.          
  48.          Arr(i).DriveName = Tmp$
  49.          Arr(i).DriveNumber = -1  'CreateFile не смог определить ресурс. Так и запишем.
  50.      
  51.        Else
  52.          
  53.          Ret = DeviceIoControl(DeviceHandle, _
  54.                IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, _
  55.                ByVal 0&, _
  56.                0&, _
  57.                OutBuffer(0), _
  58.                64, _
  59.                CountBytesReturned, _
  60.                ByVal 0&)
  61.          
  62.          If (Ret = 0) Then
  63.            
  64.             Arr(i).DriveName = Tmp$
  65.             Debug.Print "Буква диска -> " & Tmp$
  66.             'не может найти зависимость. Обозначим как -2
  67.            Arr(i).DriveNumber = -2
  68.             a$ = a$ & "Буква раздела -> " & vbTab & Arr(i).DriveName & "  на диске №" & vbTab & Arr(i).DriveNumber & vbCrLf
  69.            
  70.           Else
  71.            
  72.             Arr(i).DriveName = Tmp$
  73.             Arr(i).DriveNumber = OutBuffer(8)
  74.             a$ = a$ & "Буква раздела -> " & vbTab & Arr(i).DriveName & "  на диске №" & vbTab & Arr(i).DriveNumber & vbCrLf
  75.            
  76.          End If
  77.          
  78.       End If
  79.      
  80.       CloseHandle DeviceHandle      'выгружаем устройство
  81.      
  82.       inc i                         'диск = диск + 1
  83.  
  84.    Wend
  85. End Function
  86.  
  87. Private Sub Form_Load()
  88.    Call MappingSearch(a$)
  89.    MsgBox a$
  90.    Unload Me
  91. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.25 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы