Страница: 1 | 2 |
Вопрос: Список дисков
Добавлено: 30.03.06 18:31
Автор вопроса: mich | Web-сайт:
Как с пом. Framework получить список дисков?
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
Черный ворон
Разработчик
ICQ: 342881585
Вопросов: 32
Ответов: 256
Профиль | | #1
Добавлено: 31.03.06 04:21
Не помню откуда код.
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 = "rives"
Me.Text = "rives"
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 = "esktop"
.DriveLetter = "esktop"
.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("eviceID".Value 'ToString
drive.DriveLetter = sDriveDescription
cbDrives.ValueMember = sDriveDescription
sDriveDescription &= "\ " & mgtObject.Properties("escription".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("riveType".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-сайт:
Профиль | | #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-сайт:
Профиль | | #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-сайт:
Профиль | | #6
Добавлено: 31.03.06 19:22
Какую такую библиотеку кодов? И разница между чем?
Номер ответа: 7
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #7
Добавлено: 01.04.06 01:00
Парни.. чего вы тут опять городите??????
Какие нафиг API???? Как будто это панацея от всех бед. Забудьте про них!(если нет особых требований к их использованию) Это .NET!!!!! Тут, как в Греции.. ВСЕ ЕСТЬ!!!
Почему не воспользоваться одним из следующих вариантов? Благо во FW их более,чем предостаточно.
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 и сделай это:
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, я не ошибался, я имел в виду также вывод дисков:
Text1.AppendText([String].Join(", ", drives))