Описание функции


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")