Определение размеров свободного пространства на диске
В этом разделе описаны функции для определения типа диска и свободного пространства на нем, а также для поиска каталога
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()
![](image/opredelenie-razmerov-svobodnogo-prostranstva-na_1.gif)
Рис. 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-функций.
![](image/opredelenie-razmerov-svobodnogo-prostranstva-na_2.gif)
Рис. 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