C/C++ Windows API——获取磁盘信息

来源:互联网 发布:华为 mac过滤 编辑:程序博客网 时间:2024/05/16 01:08
// LogicalDrive.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <windows.h>//将PULARGE_INTEGER类型的字节(B)数转化为(GB)单位#define GB(x) (x.HighPart << 2) + (x.LowPart >> 20) / 1024.0int main(){    int driveCount = 0;    char szDriveInfo[16 + 1] = {0};    /*    获取主机中所有的逻辑驱动器字母,以BitMap的形式返回    DWORD GetLogicalDrives();    return 一个DWORD类型的值,第一位表示所对应的驱动器是否存在。一般情况下DWORD的数据长度是32位,在这个DWORD中,每一位对应了一个逻辑驱动器是否存在。第二位如果是“1”则表示驱动器“B:”存在,第四位如果是“1”则表示驱动器“D:”存在,以此类推    */    DWORD driveInfo = GetLogicalDrives();    _itoa_s(driveInfo, szDriveInfo, 2);    printf("GetLogicalDrives -> %016s\n", szDriveInfo);    while (driveInfo) {        if (driveInfo & 1) {            driveCount++;        }        driveInfo >>= 1;    }    printf("LogicalDriveCount = %d\n", driveCount);    /*    获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径。    DWORD GetLogicalDriveStrings(        DWORD nBufferLength,    // size of buffer, 如果是此参数为0 后面的lpBuffer则不使用        LPTSTR lpBuffer         // drive strings buffer, 用于装载逻辑驱动器名称的字串。每个名字都用一个NULL字符分隔,在最后一个名字后面用两个NULL表示中止(空中止) 例如A:\<null>C:\<null><null>    );    return    返回填充完毕的缓冲区字符的的个数..不是长度..char和TCHAR 返回数目都是一样的..    一般是4的倍数...(形如C:\ 包括之后的一个空字符0)..    如果缓冲区不够大,则返回值大于nBufferLength    如果失败..函数返回0..若想获得更多的错误信息,请使用GetLastError函数    */    int driveStrLen = GetLogicalDriveStrings(0, NULL);    printf("GetLogicalDriveStrings -> %d\n\n", driveStrLen);    //exception must have a constant value    //char driveStr[driveStrLen];    TCHAR *driveStr = new TCHAR[driveStrLen];    GetLogicalDriveStrings(driveStrLen, driveStr);    TCHAR *lpDriveStr = driveStr;    for (int i = 0; i < driveCount; i++) {        /*        获取磁盘类型        UINT GetDriveType(            _In_opt_ LPCWSTR lpRootPathName //不包括卷名的磁盘根路径名        );        #define DRIVE_UNKNOWN     0        #define DRIVE_NO_ROOT_DIR 1        #define DRIVE_REMOVABLE   2        #define DRIVE_FIXED       3        #define DRIVE_REMOTE      4        #define DRIVE_CDROM       5        #define DRIVE_RAMDISK     6        */        UINT driveType = GetDriveType(lpDriveStr);        char *szDriveTypeArr[] = {            "DRIVE_UNKNOWN",            "DRIVE_NO_ROOT_DIR",            "DRIVE_REMOVABLE",            "DRIVE_FIXED",            "DRIVE_REMOTE",            "DRIVE_CDROM",            "DRIVE_RAMDISK"        };        ULARGE_INTEGER freeBytesAvailableToCaller;        ULARGE_INTEGER totalNumberOfBytes;        ULARGE_INTEGER totalNumberOfFreeBytes;        /*        获取与一个磁盘的类型以及剩余空间容量有关的信息        BOOL GetDiskFreeSpaceExW(            _In_opt_ LPCWSTR lpDirectoryName,                       //不包括卷名的磁盘根路径名            _Out_opt_ PULARGE_INTEGER lpFreeBytesAvailableToCaller, //磁盘的可用字节数            _Out_opt_ PULARGE_INTEGER lpTotalNumberOfBytes,         //磁盘的总字节数            _Out_opt_ PULARGE_INTEGER lpTotalNumberOfFreeBytes      //磁盘的剩余字节数        );        */        GetDiskFreeSpaceEx(lpDriveStr, &freeBytesAvailableToCaller, &totalNumberOfBytes, &totalNumberOfFreeBytes);        printf("GetLogicalDriveStrings -> %ls\n", lpDriveStr);        printf("GetDriveType -> %d=%s\n", driveType, szDriveTypeArr[driveType]);        printf("GetDiskFreeSpaceEx -> Available=%f, Total=%f, free=%f\n\n", GB(freeBytesAvailableToCaller), GB(totalNumberOfBytes), GB(totalNumberOfFreeBytes));        lpDriveStr += 4;    }    delete driveStr;    system("pause");    return 0;}
0 0