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

举报
福州司马懿 发表于 2021/11/19 05:32:52 2021/11/19
【摘要】 // LogicalDrive.cpp : Defines the entry point for the console application. // #include "stdafx.h" #in...
// 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.0

int 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;
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/52820125

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。