Страница: 1 | 2 |
Вопрос: Узнать имеющиеся диски на компьютере и их тип
Добавлено: 31.01.07 21:38
Автор вопроса: Георгич
Узнать имеющиеся диски на компьютере и их тип , а точнее мне надо программно получить,
Что, у меня или у пользователь на компе, например: A:\- это гибкий диск, C:\- это локальный диск,
Е:\ - это CD-ROM и т.д. Для теста я написал следующий код :
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long ' Функция Windows API
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim str() As String 'Объявляю массив для всех дисков на компьютере
Dim i As Integer
str = IO.Directory.GetLogicalDrives 'Помещаю в массив все диски
For i = 0 To str.Length - 1 'Считываю название диска по одному
If GetDriveType(str(i)) Then 'Вернуть тип диска
str(i) = str(i) & GetDriveType(str(i)) 'Записать название диска и его тип
ListBox1.Items.Add(str(i)) 'Добавить запись в ListBox1.
End If
Next
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
End Sub
Думал, что GetDriveType(str(i)) мне вернёт значение типа Const DRIVE_CDROM = 5
Const DRIVE_FIXED = 3
Const DRIVE_RAMDISK = 6
Const DRIVE_REMOTE = 4
Const DRIVE_REMOVABLE = 2
А мне возвращает :
А:\ 8975933078237085698 - у меня это гибкий диск
С:\ 8975933078237085699 - локальный диск
D:\ 8975933078237085699 - локальный диск
E:\ 8975933078237085701 - DVD-RW
F:\ 8975933078237085701 - виртуальный диск
G:\ 8975933078237085701 - виртуальный диск
H:\ 8975933078237085701 - виртуальный диск
Что это за цифры, или где ошибка
Ответы
Всего ответов: 18
Номер ответа: 1
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #1
Добавлено: 31.01.07 22:28
Блин.. да забудь ты про эти API!
Все, что тебе надо это:
1.System.IO.DriveInfo.GetDrives() As System.IO.DriveInfo()
2.System.IO.DriveInfo.DriveType() As System.IO.DriveType
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 31.01.07 22:48
ужос... не, вы присмотритесь на цикл и условие в нём, а что в условии ))) Вот они - .NET проФФеСионалы )))
Номер ответа: 3
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #3
Добавлено: 31.01.07 22:53
Это бедолаги, котрым проФФеСионалы от VB6 подсказали юзать API!))))
А условие ... это пяць! смеялсо 0)))))
Номер ответа: 4
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #4
Добавлено: 31.01.07 23:28
Не гони на ВБ.НЕТ, на вот лучше пример, и не пользуй АПИ под НЕТ, стрёмно как то...
Private sub get_removable_devices()
Dim diskClass As New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk"
Dim disk As System.Management.ManagementObject
Dim s As String
Dim u As UInt32
For Each disk In diskClass.Get()
u = DirectCast(disk("riveType", UInt32)
s &= (CStr(disk("eviceID") & " " & get_media_type(u) & " " & ControlChars.CrLf)
Next disk
MsgBox(s)
End Function
Private Function get_media_type(ByVal u As UInt32) As String
Select Case u.ToString
Case "0" : Return "Unknown"
Case "1" : Return "No Root Directory"
Case "2" : Return "Removable Disk"
Case "3" : Return "Local Disk"
Case "4" : Return "Network Drive"
Case "5" : Return "Compact Disc"
Case "6" : Return "RAM Disk"
End Select
End Function
Номер ответа: 5
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #5
Добавлено: 31.01.07 23:57
For Each _info As DriveInfo In _infos
MessageBox.Show(_info.Name & " - " & _info.DriveType.ToString)
Next
Номер ответа: 6
Автор ответа:
AgentFire
ICQ: 192496851
Вопросов: 75
Ответов: 3178
Профиль | | #6
Добавлено: 01.02.07 00:25
У меня GetDriveInfo возвращает значения, указанные в конструкции Select Case..End Select двумя постами выше.
Номер ответа: 7
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #7
Добавлено: 01.02.07 01:11
Да в принципе одна и та же хренотень. Я этот пример дал специально... Человеку станет интересно, что такое ("SELECT * FROM Win32_LogicalDisk" пойдет в справку, и обалдеет от того, какую инфу о компе можно вытянуть, используя "Win32_ ...", пошлет подальше советников из ВБ6 и тех которые ищут сведения о компе в регистре(открыто) и начнет учить .NET
Номер ответа: 8
Автор ответа:
BUMM ®
Вопросов: 8
Ответов: 482
Профиль | | #8
Добавлено: 01.02.07 01:20
Вот подожду еще немного... Задолбают с вопросами по hardware info типа:
"Пачиму не выдайот инфу?"
"Как палучить инфу?!"
"Ниполучается.."
Возьму и напишу статью...
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 01.02.07 08:38
Это угроза?
Номер ответа: 10
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #10
Добавлено: 01.02.07 11:57
У меня в VB.2003 , System.IO.DriveInfo() и System.IO.DriveType и System.Management нет, как быть? Значить всё таки АПИ ? Тогда, какое значение должен возвращать GetDriveType()через АПИ функцию?
Номер ответа: 11
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #11
Добавлено: 01.02.07 16:22
А почему ты все еще на 2003 пишешь?? ведь уже 2007 скоро выйдет, а ты все там маешься...
Номер ответа: 12
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #12
Добавлено: 01.02.07 19:05
Да, совершенно верно VB.2003, это вчерашний день, кстати, кто-нибудь знает где, скачать
халявный VB.2005.net? И всё же, возвращаюсь к своему вопросу, какое значение должен возвращать GetDriveType()через АПИ функцию? Если не знаете, то хотя бы, напишите, что эта функция возвращает на вашем компе. Если не лень. Те же цифровые значения, как у меня или что-то другое? На форму добавить Button1 и ListBox1 :
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long ' Функция Windows API
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 im str() As String 'Объявляю массив для всех дисков на компьютере
 im i As Integer
str = IO.Directory.GetLogicalDrives 'Помещаю в массив все диски
For i = 0 To str.Length - 1 'Считываю название диска по одному
str(i) = str(i) & GetDriveType(str(i)) 'Записать название диска и его тип
ListBox1.Items.Add(str(i)) 'Добавить запись в ListBox1.
Next
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
End Sub
Номер ответа: 13
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #13
Добавлено: 01.02.07 19:22
System.Management есть еще с версии 1.0
У тебя неверная декларация АПИ функции.
Функция возвращает 32-х битное целочисленное, а ты объявил 64-х битное, поэтому получаешь мусор.
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 01.02.07 20:36
Можно и через АПИ.. Для это пишем небольшой класс..
Public Enum DriveType
Unknown = 0
NoRootDirectory = 1
Removable = 2
Fixed = 3
Network = 4
CDRom = 5
Ram = 6
End Enum
Public Class DriveInfo
<llImport("kernel32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
Private Shared Function GetDriveType(ByVal driveName As String) As Int32
'//
End Function
Public Sub New(ByVal driveName As String)
If String.IsNullOrEmpty(driveName) Then
Throw New ArgumentNullException("driveName", "riveName is nothing or empty"
End If
_name = driveName.Trim
If (_name.Length = 1) Then _name &= ":\"
End Sub
#Region " Public Property's "
Private _name As String
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
Public ReadOnly Property DriveType() As DriveType
Get
Return CType(GetDriveType(Me.Name), DriveType)
End Get
End Property
#End Region
Public Shared Function GetDrives() As DriveInfo()
Dim _drives() As String = Environment.GetLogicalDrives
Dim _list As New List(Of DriveInfo)
For Each _drive As String In _drives
_list.Add(New DriveInfo(_drive))
Next
Return _list.ToArray
End Function
End Class
А потом его юзаем..
Private Sub Button1_Click1(ByVal sender As System.Object, _
ByVal e As System.EventArgs) _
Handles Button1.Click
Dim _drives() As DriveInfo = DriveInfo.GetDrives
For Each _drive As DriveInfo In _drives
Dim _item As String = String.Format("{0}{1}{2}", _drive.Name, vbTab, _drive.DriveType)
ListBox1.Items.Add(_item)
Next
End Sub
End Class
Номер ответа: 15
Автор ответа:
Георгич
Вопросов: 16
Ответов: 52
Профиль | | #15
Добавлено: 01.02.07 21:17
Brand, ты просто голова, я поражён твоими познаниями, всё стало на своё место GetDriveType()
Стал возвращать Const DRIVE_CDROM = 5
Const DRIVE_FIXED = 3
Const DRIVE_RAMDISK = 6
Const DRIVE_REMOTE = 4
Const DRIVE_REMOVABLE = 2
А вот такой вопрос, можно ли как-то различить CD-ROM и виртуальный диск они оба возвращают = 5. Я же не могу, сказать виртуальному диску, открой лоток.