VB中獲取邏輯磁盤的信息

字號:

我們在編程的時候有時會需要得到系統(tǒng)中邏輯磁盤的一些信息,如磁盤卷標、磁盤序列號、空間大小、剩余空間等,這些信息直接使用VB提供的函數(shù)顯然是無法得到的。但是,借助于VB對WINDOWS API函數(shù)的支持,使用GetVolumeInformation和 GetDiskFreeSpace這兩個API函數(shù),我們就可以很容易的得到磁盤的相關信息。
    先來談談這兩個函數(shù)。GetVolumeInformation函數(shù)用于獲取與一個磁盤卷有關的信息,包括磁盤卷標、磁盤的序列號、文件的全路徑名中“\”與“\”之間部分的長度、文件系統(tǒng)的名稱以及文件系統(tǒng)的某些特性。GetDiskFreeSpace函數(shù)用于獲取與一個磁盤組織有關的信息,以及了解剩余空間的容量,包括磁盤上的總簇數(shù)、剩余簇數(shù)、一個簇內的扇區(qū)數(shù)和一個扇區(qū)內的字節(jié)數(shù)。
    接下來看看具體的例子。
    進入VB中,在窗體上加入一個驅動器列表框(DriveListBox)和一個列表框(ListBox),然后加入以下的腳本:
    Option Explicit
    Private Declare Function GetVolumeInformation
    Lib "kernel32" Alias
    "GetVolumeInformationA" (ByVal lpRootPathName As
    String, ByVal lpVolumeNameBuffer As
    String, ByVal nVolumeNameSize As Long,
    lpVolumeSerialNumber As Long,
    lpMaximumComponentLength As Long,
    lpFileSystemFlags As Long, ByVal
    lpFileSystemNameBuffer As String,
    ByVal nFileSystemNameSize As Long) As Long
    Private Declare Function GetDiskFreeSpace
    Lib "kernel32" Alias "GetDiskFreeSpaceA"
    (ByVal lpRootPathName As String, lpSectorsPerCluster
    As Long, lpBytesPerSector As Long,
    lpNumberOfFreeClusters As Long,
    lpTotalNumberOfClusters As Long) As Long
    Private Const FS_CASE_IS_PRESERVED = &H2
    Private Const FS_CASE_SENSITIVE = &H1
    Private Const FS_UNICODE_STORED_ON_
    DISK = &H4
    Private Const FS_PERSISTENT_ACLS = &H8
    Private Const FS_FILE_COMPRESSION = &H10
    Private Const FS_VOL_IS_COMPRESSED =
    &H8000
    Private Sub Drive1_Change()
    Dim Volume As String, SysName As String
    Dim SerialNum As Long, SysFlags As Long,
    ComponentLength As Long, Res As Long
    Dim SectorsPerCluster As Long, BytesPerSector
    As Long, NumberOfFreeClustors As
    Long, TotalNumberOfClustors As Long
    Dim FreeBytes As Long, TotalBytes As Long,
    PercentFree As Long, Dl As Long
    Dim DrvName As String
     List1.Clear
     Volume = String(256, 0)
     SysName = String(256, 0)
     DrvName = Left(Drive1.Drive, 2) & "\"
    Res = GetVolumeInformation(DrvName,
    Volume, 255, SerialNum, _
     ComponentLength, SysFlags, SysName, 255)
     If Res = 0 Then
     List1.AddItem "不能得到磁盤信息"
     Else
     List1.AddItem "卷標: " & Trim(Volume)
    List1.AddItem "序列號: " & SerialNum
    List1.AddItem "成分長度: " & ComponentLength
    List1.AddItem "文件系統(tǒng): " & Trim(SysName)
    Dl = GetDiskFreeSpace(DrvName,
    SectorsPerCluster, BytesPerSector,
    NumberOfFreeClustors, TotalNumberOfClustors)
     List1.AddItem "每簇中扇區(qū)數(shù): "
     & Format(SectorsPerCluster, "#,0")
     List1.AddItem "每扇區(qū)中字節(jié)數(shù): "
     & Format(BytesPerSector, "#,0")
     List1.AddItem "總簇數(shù): "
     & Format(TotalNumberOfClustors, "#,0")
     List1.AddItem "剩余簇數(shù): "
     & Format(NumberOfFreeClustors, "#,0")
     TotalBytes = TotalNumberOfClustors *
     SectorsPerCluster * BytesPerSector
     List1.AddItem "總字節(jié)數(shù):
     " & Format(TotalBytes, "#,0")
     FreeBytes = NumberOfFreeClustors
    * SectorsPerCluster * BytesPerSector
     List1.AddItem "剩余字節(jié)數(shù): "
    & Format(FreeBytes, "#,0")
    If SysFlags And FS_CASE_IS_PRESERVED Then
    List1.AddItem "文件名的大小寫記錄于文件系統(tǒng)"
     End If
     If SysFlags And FS_CASE_SENSITIVE Then
     List1.AddItem "文件名要區(qū)分大小寫"
     End If
     If SysFlags And FS_UNICODE_STORED_
    ON_DISK Then
     List1.AddItem "文件名保存為 Unicode 格式"
     End If
     If SysFlags And FS_PERSISTENT_ACLS Then
     List1.AddItem "文件系統(tǒng)支持文件的訪問
     控制列表(ACL)安全機制"
     End If
     If SysFlags And FS_FILE_COMPRESSION Then
     List1.AddItem "文件系統(tǒng)支持逐文件地進行文件壓縮"
     End If
     If SysFlags And FS_VOL_IS_COMPRESSED Then
     List1.AddItem "整個磁盤卷都是壓縮的"
     End If
     End If
    End Sub
    Private Sub Form_Load()
     Call Drive1_Change
    End Sub
    運行后,選擇驅動器列表框中的不同驅動器,列表框中就會顯示出該驅動器的相應信息。以上程序在VB5.0、VB6.0及WINDOWS 98中運行通過。