使用Windows API获取驱动器属性

76 阅读2分钟

使用的API

GetDriveTypeGetVolumeInformation

获取驱动器的类型

我们使用GetDriveType可以获取驱动器类型

代码

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

BOOL GetDriverInfo(PCWSTR szDrive) {
    wprintf(L"%s ", szDrive);
    UINT uDriveType;

    // 获取驱动器属性
    uDriveType = GetDriveType(szDrive);

    switch (uDriveType)
    {
    case DRIVE_UNKNOWN:  // 类型不识别
        printf("The drive type can not detected!");
        break;
    case DRIVE_NO_ROOT_DIR:
        printf("The root path is invalid");
        break;
    case DRIVE_REMOVABLE:
        printf("可移动的,软盘或者可移动的硬盘");
        break;
    case DRIVE_FIXED:  // DRIVE_FIXED为硬盘
        printf("硬盘, 不能移动的");
        break;
    case DRIVE_REMOTE:
        printf("通过网络共享过来的");
        break;
    case DRIVE_CDROM:
        printf("光盘");
        break;
    case DRIVE_RAMDISK:
        printf("U盘");
        break;
    default:
        break;
    }


    return 0;
}

int main() {
    BOOL flag;

    flag = GetDriverInfo(TEXT("C:\\"));

    return flag;
}

运行效果

image.png

获取更加详细的关于驱动器属性的信息

我们使用GetVolumeInformation API

代码

#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>

BOOL GetDriverInfo(PCWSTR szDrive) {
    wprintf(L"%s ", szDrive);
    UINT uDriveType;

    // 获取驱动器属性
    uDriveType = GetDriveType(szDrive);

    switch (uDriveType)
    {
    case DRIVE_UNKNOWN:  // 类型不识别
        printf("The drive type can not detected!");
        break;
    case DRIVE_NO_ROOT_DIR:
        printf("The root path is invalid");
        break;
    case DRIVE_REMOVABLE:
        printf("可移动的,软盘或者可移动的硬盘");
        break;
    case DRIVE_FIXED:  // DRIVE_FIXED为硬盘
        printf("硬盘, 不能移动的");
        break;
    case DRIVE_REMOTE:
        printf("通过网络共享过来的");
        break;
    case DRIVE_CDROM:
        printf("光盘");
        break;
    case DRIVE_RAMDISK:
        printf("U盘");
        break;
    default:
        break;
    }

    WCHAR szDriveName[BUFSIZ];  // 驱动器名称
    DWORD dwVolumeSerialNumber;   // 硬盘的序列号,经常用来加密
    DWORD dwMaximumComponentLength; // 硬盘允许最长的文件名是多长
    DWORD dwFileSystemFlags;     // 获取更多的关于盘的各种属性
    WCHAR szFileSystemNameBuffer[BUFSIZ];  // 获取盘的文件系统是什么类型的

    // 获取驱动器详细信息
    if (!GetVolumeInformation(
        szDrive,
        szDriveName,
        BUFSIZ,
        &dwVolumeSerialNumber,
        &dwMaximumComponentLength,
        &dwFileSystemFlags,
        szFileSystemNameBuffer,
        BUFSIZ
    )) {

        return FALSE;
    }


    // 如果有卷标,将卷标显示
    if (0 != lstrlen(szDriveName)) {
        wprintf(L"\nDrive Name is %s\n", szDriveName);
    }


    // 打印硬盘序列号
    printf("\n硬盘号是:%u", dwVolumeSerialNumber);

    // 显示允许的文件名最大长度
    printf("\n允许的文件名最大长度是:%u", dwMaximumComponentLength);

    // 打印盘的文件系统类型
    wprintf(L"\nfile system name: %ls\n", szFileSystemNameBuffer);

    // 处理文件系统标志
    if (dwFileSystemFlags & FILE_VOLUME_QUOTAS) {
        // 该文件系统是否支持配额
        printf("\n文件系统支持配额");
    }
    else {
        printf("\n文件系统不支持配额");
    }

    // 是否支持加密

    if (dwFileSystemFlags & FILE_SUPPORTS_ENCRYPTION) {
        printf("\n文件系统支持加密");
    }
    else {
        printf("\n文件系统不支持加密");
    }

    return TRUE;
}

int main() {
    BOOL flag;

    flag = GetDriverInfo(TEXT("E:\\"));

    return flag;
}

运行效果

image.png