Visual Basic 6. Руководство разработчика

       

Определение размеров свободного пространства на диске


В этом разделе описаны функции для определения типа диска и свободного пространства на нем, а также для поиска каталога

Windows и определения текущего каталога. Перечислим их.

•  GetDriveType()

•  GetDiskFreeSpace()

•  GetWindowsDirectory()

•  GetCurrentDirectory()

Эти функции предоставляют дополнительные возможности, которых нет в Visual Basic. Например, вы можете определить, есть ли свободное пространства на диске и является ли данное устройство приводом CD-ROM.

Функция GetDriveTypeQ

Эта функция позволяет определить тип дисковода.

Объявляется она следующим образом

Private Declare Function GetDriveType Lib "kernel32" Alias _

"GetDriveTypeA" (ByVal nDrive As String) As Long

Вы передаете функции имя диска, который необходимо проверить с помощью параметра nDrive, и функция возвращает значение типа Long, которое указывает тип диска. В табл. 13.2 приведены типы устройств и их описания



Таблица 13.2. Описание типов устройств

Значение

Описание

0

1

DRIVEREMOVABLE

DRIVEFIXED

DRIVEREMOTE

DRIVECDROM

DRIVERAMDISK

Тип диска определить невозможно

Данный каталог не является корневым

Сменное устройство, например ZIP-накопитель

Несменное устройство, например жесткий диск С

Устройство удаленного доступа, например сетевой диск

CD-ROM-устройство

RAM-диск

VB6 в действии: проект Drives

Приложение Drives (рис 13.2) обеспечивает вывод на экран окна, содержащего информацию о выбранном диске (тип и свободный объем памяти), о текущей папке и о папке Windows системы. Каждый раз, когда пользователь выбирает другое устройство, информация в окне формы изменяется. В приложении Drives используются три API-функции: GetDiskFreeSpace(), GetCurrentDirectory() и GetWindowsDirectory()

Рис. 13.2. Приложение Drives

Функция GetDiskFreeSpace()

Эта функция позволяет получить разнообразную информацию, касающуюся диска, включая количество свободного пространства. Функция возвращает также количество секторов на кластер, байтов на сектор, количество свободных кластеров на диске и общее количество кластеров. Функция


GetDiskFreeSpace() не предос­тавляет информацию о свободном дисковом пространстве, но его величина может быть вычислена на основании данных о количестве байтов на сектор, секторов на кластер и свободных кластеров Функция объявляется следующим образом:

Private Declare Function GetDiskFreeSpace Lib "kernel32" _

Alias "GetDiskFreeSpaceA" (ByVal IpRootPathName As

_

String, IpSectorsPerCluster As Long, IpBytesPerSector_

As Long, IpNumberOfFreeClusters As Long _

IpTotalNumberOfClusters As Long) As Long

Назначение параметров этой функции понятны и соответствуют их (значимым) именам.

Чтобы определить размеры свободного пространства на диске С, используются следующие операторы:

retValue

- GetDiskFreeSpace("с:\” Sectors, Bytes,_

freeClusters, totalClusters)

FreeSpace = Sectors * Bytes *

freeClusters

Общий объем свободного пространства равен произведению количества свободных кластеров, секторов на кластер и байтов на сектор.

Функция GetCurrentDirectory()

Эту функцию следует применять в случаях, когда необходимо определить текущий каталог, из которого была запущена программа. Данная функция анало­гична свойству Арр. Path Visual Basic, и принимает два параметра, один из которых — длина буфера, а второй — указатель на строковую переменную (буфер), в которой будет сохранен путь к текущему каталогу. Функция должна объявляется следующим образом:

Private Declare Function GetCurrentDirectory Lib

"kernel32"

Alias "GetCurrentDirectoryA" (ByVal nBufferLength

_

As Long, ByVal IpBuffer As String) As Long

После вызова функции параметр lpBuffer содержит текущий путь

Функция GetWindowsDirectory()

Эта функция позволяет узнать, в какую папку на жестком диске инсталлиро­вана Windows. Эта информация нужна для дополнительной инсталляции файлов инициализации или справки в каталог Windows. Параметры этой функции иден­тичны параметрам GetCurrentDirectory(). Ее объявление имеет вид:

Private Declare Function GetWindowsDirectory Lib "kernel32" _



Alias "GetWindowsDirectoryA" (ByVal IpBuffer As _

String, ByVal nSize As Long) As Long

Полный текст программы Drives приведен ниже.

Программа 13.3. Проект Drives

Option Explicit

Private Declare Function GetDriveType Lib "kernel32" _

Alias "GetDriveTypeA" (ByVal nDrive As String) As Long

Private Declare Function GetDiskFreeSpace Lib "kernel32" _

Alias "GetDiskFreeSpaceA" (ByVal IpRootPathName _

As String, IpSectorsPerCluster As Long,_

IpBytesPerSector As Long, _

IpNumberOfFreeClusters As Long, _

IpTotalNumberOfClusters As Long) As Long

Private Declare Function GetCurrentDirectory Lib "kernel32" _

Alias "GetCurrentDirectoryA" (ByVal nBufferLength _

As Long, ByVal IpBuffer As String) As Long

Private Declare Function GetWindowsDirectory Lib "kernel32"

Alias "GetWindowsDirectoryA" (ByVal IpBuffer As String,_

ByVal nSize As Long) As Long

Const DRIVE_CDROM = 5

Const DRIVE_FIXED = 3

Const DRIVE_RAMDISK = 6

Const DRIVE_REMOTE = 4

Const DRIVE_REMOVABLE = 2

Private Sub Commandl_Click()

End

End Sub

Private Sub Drivel_Change()

Dim driveType As Long

Dim freeSpace As Long, Sectors As Long

Dim Bytes As Long

Dim freeClusters As Long, totalClusters As Long

Dim retValue As Long

Dim buffer As String * 255

Dim DName As String

Screen.MousePointer = vbHourglass

DoEvents

DName = Left(Drivel.Drive, 2) & "\"

driveType = GetDriveType(DName)

Select Case driveType

Case 0

Label5.Caption = "UNDETERMINED" Case DRIVE_REMOVABLE

Label5.Caption = "REMOVABLE"

Case DRIVE_FIXED

Label5.Caption = "FIXED"

Case DRIVE_REMOTE

Label5.Caption = "REMOTE"

Case DRIVE_CDROM

     Label5 Caption - "CDROM"

Case DRIVE_RAMDISK

Label5 Caption - "RAMDISK"

End Select

‘Вычисляем свободное пространство на диске

retValue   GetDiskFreeSpace(DName, Sectors, Bytes,_

freeClusters, totalClusters)

Label6 Caption = Sectors * Bytes * freeClusters



‘Определяем путь к текущему каталогу

retValue = GetCurrentDirectory(255, buffer)

Label7 Caption = buffer

‘Определяем путь к каталогу Windows

retValue =

GetWindowsDirectory(buffer, 255)

Label8 Caption = buffer

Screen MousePointer

= vbDefault

DoEvents

Debug

Print App = Path

End Sub

Private Sub Form_Load()

Drivel_Change

End Sub

Прочие файловые функции

Иногда пользователю требуется информация о файле, например, о его разме­щении, атрибутах или размере. Приложение Filelnfo (рис. 13.3) на компакт-диске демонстрирует возможности получения информации о файле с помощью API-функций.



Рис. 13.3. Приложение Filelnfo

VB6 в действии: проект Filelnfo

Приложение Filelnfo использует следующие функции:

•  GetFullPathName()

•  GetFileAttnbutes()

•   GetFileSize()

Рассмотрим их подробнее.

GetFullPathName(). Функция возвращает полный путь к файлу. Объявляется она следующим образом:

Private Declare Function GetFullPathName Lib "kernel32" _

Alias "GetFullPathNameA" (ByVal IpFileName As String, _

ByVal nBufferLength As Long, ByVal IpBuffer As String, _

ByVal IpFilePart As String) As Long

В приложении Filelnfo эта функция используется для получения пути к файлу, указанному пользователем в стандартном диалоговом окне File Open (Открыть файл)

В качестве параметра функции передается имя файла, путь к которому необходимо определить, а функция возвращает путь в переменной filePath.

GetFileAttributes().

Функция возвращает длинное целое значение, указывающее на состояние файла только для чтения, скрытый или нормальный. Она аналогична функции GetFileAttributes() в Visual Basic. Объявляется следующим образом:

Private Declare Function GetFileAttributes Lib "kernel32"

Alias

"GetFileAttributesA" (ByVal IpFileName As String) As Long

В табл. 13.3 приведены значения атрибутов файла. Использование этих функции продемонстрировано в программе Filelnfo.

Таблица 13.3. Атрибуты файлов

Значение

Описание

FILE_ATTRIBUTE_ ARCHIVE

Архивный файл

FILE_ATTRIBUTE_ COMPRESSED

Сжатый файл

FILE_ ATTRIBUTE_ DIRECTORY

Имя каталога

FILE_ATTRIBUTE_ HIDDEN

Файл или каталог является скрытым: при обычном выводе на экран его не видно

FILE_ATTRIBUTE_ NORMAL

Файл не имеет атрибутов

FILE_ATTRIBUTE_ READONLY

Файл предназначен только для чтения

FILE_ ATTRIBUTE_ SYSTEM

Файл является частью операционной системы

<


GetFileSize().

Чтобы определить размер файла, следует открыть его с помощью функции CreateFile(), использовав в ней параметр OPEN_EXITING (чтобы проверить, что открываемый файл существует). После этого можно воспользоваться функцией GetFileSize(), чтобы получить размер файла в байтах. Естественно, после выполнения операции файл необходимо закрыть с помощью функции CloseHandle().

Приведем исходный текст программы Filelnfo.

Программа 13.4. Проект Filelnfo

Option Explicit

Private Declare Function GetFileAttributes Lib "kernel32"_

Alias "GetFileAttributesA" (ByVal IpFileName As String) As     Long

Private Declare Function GetFullPathName Lib "kernel32" _

Alias "GetFullPathNameA" (ByVal IpFileName As String, _

ByVal nBufferLength As Long, ByVal IpBuffer As String,_

ByVal IpFilePart As String) As Long

Private Declare Function CreateFile Lib "kernel32" Alias _

"CreateFileA" (ByVal IpFileName As String, _

ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _

ByVal IpSecurityAttributes As Any, _

ByVal dwCreationDisposition As Long, _

ByVal dwFlagsAndAttributes As Long, _

ByVal hTemplateFile As Long) As Long

Private Declare Function GetFileSize Lib "kernel32"

(ByVal hFile As Long, IpFileSizeHigh As Long) As Long

Private Declare Function CioseHandle Lib "kernel32" _

(ByVal h0b]ect As Long) As Long

Const FILE_ATTRIBUTE_ARCHIVE = &H20

Const FILE_ATTRIBUTE_COMPRESSED =

&H800

Const FILE_ATTRIBUTE_DIRECTORY =

&H10

Const FILE_ATTRIBUTE_HIDDEN =

&H2

Const FILE_ATTRIBUTE_NORMAL =

&H80

Const FILE_ATTRIBUTE_READONLY =

&H1

Const FILE_ATTRIBUTE_SYSTFM &H4

Const GENERIC_READ =

&H80000000

Const OPEN_EXISTING =

3

Const GENERIC_WRITE = &H40000000

Private Sub Commandl_Click()

Dim retValue As Long

Dim filePath As String * 255

Dim attrFlag As Long, attrStr As String

Dim fileName As String, filePointer As Long

Dim fileSize As Long



CommonDialogI.ShowOpen

If CommonDialogI fileName <> "" Then fileName = _

CommonDialogI fileName

‘Определение пути к файлу

retValue = GetFullPathName(fileName, 255, filePath, 0)

Label5 Caption – filePath

‘Определение атрибутов файла

attrFlag = GetFileAttributes(fileName)

If (attrFlag And FILE_ATTRIBUTE_ARCHIVE) Then

_

attrStr =

"Archive"

If ( attrFlag And FILE_ATTRIBUTE_COMPRESSED) Then _

                     attrStr = attrStr & "Compressed"

If (attrFlag And FILE_ATTRIBUTE_DIRECTORY) Then _

            attrStr = attrStr & "Directory"

If (attrFlag And FILE_ATTRIBUTE_HIDDEN) Then _

attrStr = attrStr & "Hidden"

If (attrFlag And FILE_ATTRIBUTE_NORMAL) Then _

attrStr = attrStr & "Normal"

If (attrFlag And FILE_ATTRIBUTE_READONLY) Then _

attrStr = attrStr & "Read-Only"

If (attrFlag And FILE_ATTRIBUTE_SYSTEM) Then _

attrStr = attrStr & "System"

Label6.Caption = attrStr

‘ Определение размера файла

filePointer = CreateFile(fileName, GENERIC_READ Or _

GENERIC_WRITE, 0&, 0&, OPEN_EXISTING, _ FILE_ATTRIBUTE_NORMAL, 0&)

fileSize = GetFileSize(filePointer, 0&)

Label7.Caption = fileSize

CloseHandle (filePointer)

End Sub


Содержание раздела