Описание функции
GetDriveInfo
Получить информацию о диске в виде "диск, метка, тип ФС, размер"
GetDriveInfo(DriveLetter$)
Параметры
DriveLetter$ | Диск, например "C" |
Возвращаемое значение
Успех: | Возвращает строку в виде "диск, метка, тип ФС, размер", для вставки в ListIconGadget() (разделённую #LF$), например C, Win10, NTFS, 787.983 |
Примечания
Используйте GetDrives().Пример
EnableExplicit
EnableExplicit
; https://usbtor.ru/viewtopic.php?p=76839#76839
; https://www.purebasic.fr/english/viewtopic.php?p=153623#p153623
;Чтение размера RAW диска
Structure DISK_GEOMETRY
Cylinders.q
MediaType.l
TracksPerCylinder.l
SectorsPerTrack.l
BytesPerSector.l
EndStructure
Structure DISK_GEOMETRY_EX Extends DISK_GEOMETRY
DiskSize.q
byte.b[1]
EndStructure
; #FILE_ANY_ACCESS = 0
; #FILE_READ_DATA = 1
; #METHOD_BUFFERED = 0
; #IOCTL_DISK_BASE = 7
; Macro CTL_CODE(DeviceType, Function, Method, Access)
; ((DeviceType)<<16)|((Access)<<14)|((Function)<<2)|(Method)
; EndMacro
; #IOCTL_DISK_GET_DRIVE_GEOMETRY_EX = CTL_CODE(#IOCTL_DISK_BASE, $28, #METHOD_BUFFERED, #FILE_READ_DATA)
#IOCTL_DISK_GET_DRIVE_GEOMETRY_EX = $740A0
Declare.q GetDriveSize(Drive.s)
Procedure.q GetDriveSize(Drive.s)
Protected device.l, bytes.l, os.OSVERSIONINFO, disk.DISK_GEOMETRY_EX
os\dwOSVersionInfoSize = SizeOf(OSVERSIONINFO)
device = CreateFile_("\\.\" + Drive, #GENERIC_READ | #GENERIC_WRITE, #FILE_SHARE_READ | #FILE_SHARE_WRITE, 0, #OPEN_EXISTING, 0, 0)
If device <> #INVALID_HANDLE_VALUE
DeviceIoControl_(device, #IOCTL_DISK_GET_DRIVE_GEOMETRY_EX, 0, 0, @disk, SizeOf(disk), @bytes, 0)
CloseHandle_(device)
EndIf
ProcedureReturn disk\Disksize
EndProcedure
Procedure.s GetDriveInfo(Drive2$)
Protected.s Lfwrk, FileSystem, VolName, r = Chr(10)
Protected.q total_bytes
Lfwrk = Drive2$ + ":\"
FileSystem = Space(256)
VolName = Space(256)
If GetVolumeInformation_(@Lfwrk, @VolName, 255, 0, 0, 0, @FileSystem, 255)
Drive2$ + r + VolName + r + FileSystem
If (GetDiskFreeSpaceEx_(Lfwrk, 0, @total_bytes, 0))
; Drive2$ + " "+ Str(total_bytes/1048576)+ " Мб"
Drive2$ + r + StrF(ValF(StrF(total_bytes / 1024)) / 1048576, 3)
Else
Drive2$ + r + "---"
EndIf
Else
Drive2$ + r + "---" + r + "---"
If OSVersion() < #PB_OS_Windows_Vista
total_bytes = GetDriveSize(Left(Drive2$, 2))
If total_bytes
Drive2$ + r + StrF(ValF(StrF(total_bytes / 1024)) / 1048576, 3)
Else
Drive2$ + r + "---"
EndIf
Else
Drive2$ + r + "---"
EndIf
EndIf
ProcedureReturn Drive2$
EndProcedure
Debug GetDriveInfo("C")