Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

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

 

  Вопрос: Список дисков Добавлено: 30.03.06 18:31  

Автор вопроса:  mich | Web-сайт: belkyokushin.net | ICQ: 261800349 
Как с пом. Framework получить список дисков?

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 Черный ворон



Разработчик

ICQ: 342881585 

Вопросов: 32
Ответов: 256
 Профиль | | #1 Добавлено: 31.03.06 04:21
Не помню откуда код.

'Imports System.Management
Imports System.Collections
'Imports System.Drawing.Drawing2D

Public Class Drives
    Inherits System.Windows.Forms.Form

    Dim drive As driveInfo
    Dim alDrives As New ArrayList()
    Dim mgtObjectSearcher As System.Management.ManagementObjectSearcher
    Dim mgtObject As System.Management.ManagementObject


#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents cbDrives As System.Windows.Forms.ComboBox
    Friend WithEvents ilDrives As System.Windows.Forms.ImageList
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container()
        Dim configurationAppSettings As System.Configuration.AppSettingsReader = New System.Configuration.AppSettingsReader()
        Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(Drives))
        Me.cbDrives = New System.Windows.Forms.ComboBox()
        Me.ilDrives = New System.Windows.Forms.ImageList(Me.components)
        Me.SuspendLayout()
        '
        'cbDrives
        '
        Me.cbDrives.DisplayMember = CType(configurationAppSettings.GetValue("cbDrives.DisplayMember", GetType(System.String)), String)
        Me.cbDrives.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
        Me.cbDrives.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList
        Me.cbDrives.IntegralHeight = CType(configurationAppSettings.GetValue("cbDrives.IntegralHeight", GetType(System.Boolean)), Boolean)
        Me.cbDrives.Location = New System.Drawing.Point(52, 27)
        Me.cbDrives.Name = "cbDrives"
        Me.cbDrives.Size = New System.Drawing.Size(288, 21)
        Me.cbDrives.TabIndex = 0
        Me.cbDrives.Text = CType(configurationAppSettings.GetValue("cbDrives.Text", GetType(System.String)), String)
        '
        'ilDrives
        '
        Me.ilDrives.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit
        Me.ilDrives.ImageSize = New System.Drawing.Size(16, 16)
        Me.ilDrives.ImageStream = CType(resources.GetObject("ilDrives.ImageStream";), System.Windows.Forms.ImageListStreamer)
        Me.ilDrives.TransparentColor = System.Drawing.Color.Transparent
        '
        'Drives
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(392, 134)
        Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.cbDrives})
        Me.Name = ";Drives"
        Me.Text = ";Drives"
        Me.ResumeLayout(False)

    End Sub

#End Region

    Private Sub Fred_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        mgtObjectSearcher = New System.Management.ManagementObjectSearcher("SELECT * FROM Win32_LogicalDisk";)

        drive = New driveInfo()

        With drive
            .DriveDescription = ";Desktop"
            .DriveLetter = ";Desktop"
            .DriveImage = 0
        End With

        alDrives.Add(drive)

        Call updatedrives()
        Call addDrivesToCombo()

    End Sub

    Private Sub addDrivesToCombo()

        Dim dDrive As driveInfo
        For Each dDrive In alDrives
            cbDrives.Items.Add("";)
        Next


        '-- Show the desktop
        If alDrives.Count > 0 Then
            cbDrives.SelectedIndex = 0
        End If

    End Sub

    Private Sub updatedrives()

        For Each mgtObject In mgtObjectSearcher.Get()

            'Build a new class to hold our drive information
            drive = New driveInfo()

            ' Get the drive
            Dim sDriveDescription As String = ""

            sDriveDescription = mgtObject.Properties(";DeviceID";).Value  'ToString

            drive.DriveLetter = sDriveDescription

            cbDrives.ValueMember = sDriveDescription

            sDriveDescription &= "\  " & mgtObject.Properties(";Description";).Value   '.ToString


            'Determine if the drive is available. If the property
            'is not set, the drive cant be accessed.
            If IsNothing(mgtObject.Properties("Size";).Value) Then
                sDriveDescription &= "  Not Available"
            Else
                sDriveDescription &= "  " & mgtObject.Properties("VolumeName";).Value  '.ToString
            End If

            drive.DriveDescription = sDriveDescription

            'Get the image for the disk
            Select Case Convert.ToInt16(mgtObject.Properties(";DriveType";).Value)
                Case 0 : drive.DriveImage = 6 'Unknown
                Case 1 : drive.DriveImage = 6 'No root directory
                Case 2 : drive.DriveImage = 1 'Removable
                Case 3 : drive.DriveImage = 2 'Local disk
                Case 4 : drive.DriveImage = 4 'Network Disk
                Case 5 : drive.DriveImage = 3 'Compact Disk
                Case 6 : drive.DriveImage = 0 'RAM disk
            End Select

            'Special network case
            If (drive.DriveImage = 4) Then  '4
                If sDriveDescription.IndexOfAny("Not Available";) > 0 Then
                    drive.DriveImage = 5  'Network Disconnected
                End If
            End If

            alDrives.Add(drive)

        Next

    End Sub

    Private Sub cbDrives_DrawItem(ByVal sender As Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles cbDrives.DrawItem



        Dim rRectangle As New Rectangle(1, 1, 200, 250)







        e.DrawBackground()
        e.DrawFocusRectangle()

        '------------------------------------------------
        'When the list is empty, the index will be -1 so
        'Draw the rectangle and exit safely            --
        '------------------------------------------------

        If e.Index < 0 Then Exit Sub

        '-Place desktop flush and indent drives
        Dim iOffset As Integer = 0
        If e.Index = 0 Then   'if desktop
            iOffset = 0
        Else
            iOffset = 10
        End If

        '-- Get the information on each drive --
        Dim dDrive As New driveInfo()
        dDrive = alDrives(e.Index)

        '-- Retrieve the drive description and image --
        Dim sDriveDescription As String = dDrive.DriveDescription
        Dim iDriveImage As Integer = dDrive.DriveImage
        Dim bmDriveBmp As Bitmap = ilDrives.Images(iDriveImage)

        '-- Drawing variables we will soon need --
        Dim aBrush As Brush = System.Drawing.Brushes.Black
        Dim sFormat As StringFormat = StringFormat.GenericTypographic
        Dim itemHeight As Integer = cbDrives.ItemHeight

        'e.DrawBackground()
        'e.DrawFocusRectangle()

        '-- First, draw the image of the drive on the combobox item
        '-- indented by the iOffset amount
        e.Graphics.DrawImage(bmDriveBmp, iOffset, e.Bounds.Top + (itemHeight - bmDriveBmp.Height) \ 2)

        '-- Before we draw the text, if the item is selected let's make
        '-- it white so it will be visible.
        If (e.State And DrawItemState.Selected) Then
            aBrush = System.Drawing.Brushes.White
        End If

        sFormat.LineAlignment = StringAlignment.Center
        e.Graphics.DrawString(sDriveDescription, e.Font, aBrush, (20 + iOffset), e.Bounds.Top + (e.Bounds.Height \ 2), sFormat)

    End Sub

    Private Sub cbDrives_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cbDrives.SelectedIndexChanged



    End Sub
End Class

Friend Class driveInfo
    Dim m_DriveLetter As String = ""
    Dim m_DriveDescription As String = ""
    Dim m_DriveImage As Integer = 0


    Sub New()

    End Sub

    Friend Property DriveLetter() As String
        Get
            Return m_DriveLetter
        End Get
        Set(ByVal Value As String)
            m_DriveLetter = Value
        End Set
    End Property

    Friend Property DriveDescription() As String
        Get
            Return m_DriveDescription
        End Get
        Set(ByVal Value As String)
            m_DriveDescription = Value
        End Set
    End Property

    Friend Property DriveImage() As Integer
        Get
            Return m_DriveImage
        End Get
        Set(ByVal Value As Integer)
            m_DriveImage = Value
        End Set
    End Property
End Class



Если надо могу этот пример скинуть

Ответить

Номер ответа: 2
Автор ответа:
 mich



ICQ: 261800349 

Вопросов: 19
Ответов: 148
 Web-сайт: belkyokushin.net
 Профиль | | #2
Добавлено: 31.03.06 15:46
Да уж. Я думал мой способ слишком длинный.

    Sub GetDrive()
        Dim DriveListBox1 As New Microsoft.VisualBasic.Compatibility.VB6.DriveListBox
        For i As Integer = 0 To DriveListBox1.Items.Count - 1
            Dim pt() As String = DriveListBox1.Items(i).Split(":";)
            MsgBox(pt(0) & ":\";)
        Next
    End Sub


ANOD говорит что в две строчки можно

Ответить

Номер ответа: 3
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #3 Добавлено: 31.03.06 16:31
Величина кода определяется не количеством строк:)
Самый короткий и эффективный способ - вызов апи GetLogicalDriveStrings. Она заполняет буфер именами дисков

Ответить

Номер ответа: 4
Автор ответа:
 mich



ICQ: 261800349 

Вопросов: 19
Ответов: 148
 Web-сайт: belkyokushin.net
 Профиль | | #4
Добавлено: 31.03.06 17:09
Api! Api! Api!
И программы писать следует только на Си.
;)

Ответить

Номер ответа: 5
Автор ответа:
 Fever



Вопросов: 60
Ответов: 808
 Профиль | | #5 Добавлено: 31.03.06 17:14
Разница очевидна. Mich, брось свою библиотеку кодов мне на мыло,плиз!

Ответить

Номер ответа: 6
Автор ответа:
 mich



ICQ: 261800349 

Вопросов: 19
Ответов: 148
 Web-сайт: belkyokushin.net
 Профиль | | #6
Добавлено: 31.03.06 19:22
Какую такую библиотеку кодов? И разница между чем?

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #7 Добавлено: 01.04.06 01:00
Парни.. чего вы тут опять городите??????
Какие нафиг API???? Как будто это панацея от всех бед. Забудьте про них!(если нет особых требований к их использованию) Это .NET!!!!! Тут, как в Греции.. ВСЕ ЕСТЬ!!! :-)
Почему не воспользоваться одним из следующих вариантов? Благо во FW их более,чем предостаточно.

1. System.Environment.GetLogicalDrives
2. System.IO.Directory.GetLogicalDrives
3. System.IO.DriveInfo.GetDrives
4. My.Computer.FileSystem.Drives (VS 2005)


и это еще далеко не полный список способов того,как можно получить список дисков..
Вы бы почаще в Object Browser заглядывали на досуге.. :-)

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #8 Добавлено: 01.04.06 01:40
mich
ANOD ошибался, тут достаточно одной строчки! :-)

Ответить

Номер ответа: 9
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #9 Добавлено: 01.04.06 01:41
:)
Все ваши "разные" пути ведут в Рим - в GetLogicalDriveStrings
Поставь брекпоинт на GetLogicalDriveStrings и воспользуйся любым из своих вариантов - окажешься в брекпоинте :) Ну и заодно, пока код доберется до GetLogicalDriveStrings, произведешь кучу бесполезных действий :)

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #10 Добавлено: 01.04.06 03:30
HOOLIGAN
А хоть бы и так.. к чему мне все эти геморрои с буфером, нуль-символом в конце строки и прочим радостям API? Зачем мне изобретать велосипед,когда за меня уже все придумали люди создавшие FW. Мне лишь остается воспользоваться этими благами, и не задумываться о том, правильно ли я передал параметры и достаточно ли у меня большой буфер.. А те действия, которые ты называешь бесполезными,сводятся к тем же что и у тебя.. создания буфера и т.д.. Так что я совершенно не вижу смысла в прямом использовании АПИ. Разумеется,если есть возможность обойтись стандартными средствами. Но я пока за свою практику ни разу не столнулся с необходимостью прямого вызова. Мне не доводилось решать задачи специфического характера,где без АПИ ну никак.. :-)

Ответить

Номер ответа: 11
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #11 Добавлено: 01.04.06 09:08
EROS
Какие нули? Какие буферы? Вы о чём?
Приятель, включи VB6 и сделай это:

Dim s As String * 256
GetLogicalDriveStrings 256, ByVal s
Debug.Print s


Всего один вызов функции и больше НИ-ЧЕ-ГО!
Не сделаешь ты короче, проще, эффективнее и быстрее. Никогда.
Потому что .Net создает программы огромные, неэффективные, медленные.

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 01.04.06 13:13
HOOLIGAN
Согласись, что люди придумавшие инкапсуляцию, придумали ее не просто так. Ведь ты сам прекрасно понимаешь,что для вызовов API грамотные люди создают так называемые "обертки, оболочки". Да и далеко ходить не надо, ты сам зачаcтую даешь людям свои разработки-готовые модули, предназначенные для вызова 2-3 и больше API.Так воспринимай же FW не чем иным как готовым модуляи,оберткам и т.д. Я не думаю,что я смог бы создать модуль по вызову той или иной ф-ии лучше,чем это сделали создали FW. Я не беру в расчет конкретный пример этой темы, потому что он достаточно тривиален, а задай автор вопрос о получение всей инфы о конкретном диске и ,согласись, твой код вырос бы в 10-ки раз.. а мой бы так и остался 1-ой строчкой.Я нигода не вдавался в полемику по поводу "А чё круче?",и не стану этого делать сейяас. Скажу лишь одно, и прошу учесть,что это чисто мое,личное мнение. После года на .NET я глубоко сожалею о тех годах,что провел за VB6. Я только сейчас начинаю понимать всю убогость этого языка.И какие бы доводы ты не говорил в защиту VB6 в любом случае я останусь при своем мнении.
Надеюсь, без взаимных обид.. ибо я сказал то,что думаю и без всякого желания кого либо обидеть или задеть.

Ответить

Номер ответа: 13
Автор ответа:
 HOOLIGAN



Вопросов: 0
Ответов: 1066
 Профиль | | #13 Добавлено: 01.04.06 14:17
Да, грамотные люди создают обертки для вызовов апи. Не спорю.
Только создают их они для неграмотных, которые сами не могут правильно вызвать апи. Это своего рода страховка, все эти обёртки, инкапсуляция, классы и т.п. Страховка от неумелых и неквалифицированных действий. Чтобы любая домохозяйка могла сляпать программу.

P.S.
Я никому никаких модулей-оберток не давал.
Только самое необходимое, чтобы чел за мусором обёртки не проглядел основного.
И сам не пользуюсь, нет необходимости.
P.P.S.
Без обид :) Но фреймворк - это подпорка для ламеров, не умеющих общаться с операционной системой, в среде которой обитают их "программы".

Ответить

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



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 01.04.06 14:37
Пусть будет так, ибо вдаваться в полемику нет никакого желания.. в любом случае - каждый из нас останется при своем мнении...

Ответить

Номер ответа: 15
Автор ответа:
 ANoD



Вопросов: 5
Ответов: 18
 Профиль | | #15 Добавлено: 01.04.06 19:42
mich, я не ошибался, я имел в виду также вывод дисков:
Dim drives As [String];() = Environment.GetLogicalDrives()
                Text1.AppendText([String].Join(", ", drives))

Ответить

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

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



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