Страница: 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.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, я не ошибался, я имел в виду также вывод дисков:
 
    
) = Environment.GetLogicalDrives()
                Text1.AppendText([String].Join(", ", drives))