Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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
Вот они - .NET проФФеСионалы :)))

Это бедолаги, котрым проФФеСионалы от 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(";DriveType";), UInt32)

            s &= (CStr(disk(";DeviceID";)) & " " & 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
        Dim _infos() As DriveInfo = DriveInfo.GetDrives
        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
        ;Dim str() As String 'Объявляю массив для всех дисков на компьютере
        ;Dim 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
У меня в VB.2003 , System.IO.DriveInfo() и System.IO.DriveType и System.Management нет, как быть? Значить всё таки АПИ ? Тогда, какое значение должен возвращать GetDriveType()через АПИ функцию?

System.Management есть еще с версии 1.0

У тебя неверная декларация АПИ функции.
Функция возвращает 32-х битное целочисленное, а ты объявил 64-х битное, поэтому получаешь мусор.

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 01.02.07 20:36
У меня в VB.2003 , System.IO.DriveInfo() и System.IO.DriveType и System.Management нет, как быть? Значить всё таки АПИ ?

Можно и через АПИ.. Для это пишем небольшой класс..

Imports System.Runtime.InteropServices

Public Enum DriveType
    Unknown = 0
    NoRootDirectory = 1
    Removable = 2
    Fixed = 3
    Network = 4
    CDRom = 5
    Ram = 6
End Enum

Public Class DriveInfo

    <;DllImport("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", ";DriveName 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

А потом его юзаем..

Public Class Form1

    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. Я же не могу, сказать виртуальному диску, открой лоток.

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам