You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Windows卷序列号编程获取卷名称/标签?

通过卷序列号获取对应卷标签的实现方法

由于Windows没有直接通过卷序列号查询卷标签的API,我们可以通过枚举所有挂载卷并逐一匹配序列号的方式实现,具体步骤如下:

  1. 枚举系统所有卷的根路径
    使用GetLogicalDriveStrings函数获取系统中所有已挂载的驱动器根路径(如C:\、D:\)。

  2. 逐个获取卷的信息
    对每个根路径,调用GetVolumeInformationW函数,获取该卷的序列号和卷标签。

  3. 匹配目标序列号
    将获取到的卷序列号与目标序列号对比,匹配成功时即可得到对应的卷标签。

示例代码(C++)

#include <windows.h>
#include <iostream>
#include <string>

// 把卷序列号(DWORD)转换成"XXXX-XXXX"格式的字符串
std::wstring SerialNumberToString(DWORD serialNumber)
{
    WCHAR buffer[16];
    swprintf_s(buffer, L"%04X-%04X", 
        HIWORD(serialNumber), LOWORD(serialNumber));
    return std::wstring(buffer);
}

std::wstring GetVolumeLabelBySerial(DWORD targetSerial)
{
    WCHAR drivePaths[1024];
    if (!GetLogicalDriveStringsW(1024, drivePaths))
    {
        return L"";
    }

    WCHAR* currentDrive = drivePaths;
    while (*currentDrive != L'\0')
    {
        // 只处理固定磁盘和可移动磁盘(跳过网络驱动器等)
        UINT driveType = GetDriveTypeW(currentDrive);
        if (driveType != DRIVE_FIXED && driveType != DRIVE_REMOVABLE)
        {
            currentDrive += wcslen(currentDrive) + 1;
            continue;
        }

        WCHAR volumeLabel[MAX_PATH] = {0};
        DWORD serialNumber = 0;
        if (GetVolumeInformationW(
            currentDrive,
            volumeLabel, MAX_PATH,
            &serialNumber,
            nullptr, nullptr, nullptr, 0))
        {
            if (serialNumber == targetSerial)
            {
                return std::wstring(volumeLabel);
            }
        }

        currentDrive += wcslen(currentDrive) + 1;
    }

    return L""; // 未找到匹配的卷
}

int main()
{
    // 示例:目标卷序列号(比如对应"1234-ABCD"的DWORD值)
    DWORD targetSerial = 0xABCD1234;
    std::wstring label = GetVolumeLabelBySerial(targetSerial);

    if (!label.empty())
    {
        std::wcout << L"匹配到的卷标签:" << label << std::endl;
    }
    else
    {
        std::wcout << L"未找到对应序列号的卷" << std::endl;
    }

    return 0;
}

注意事项

  • 序列号格式转换:Windows的卷序列号是32位DWORD值,通常显示为XXXX-XXXX(高16位+低16位的十六进制),代码中SerialNumberToString函数可完成这种格式转换,方便和用户看到的序列号对应。
  • 驱动器类型过滤:代码中跳过了网络驱动器等非本地卷,可根据需求调整GetDriveType的判断逻辑。
  • 权限问题:部分卷(如系统盘)可能需要管理员权限才能获取完整信息,运行程序时注意权限。

内容的提问来源于stack exchange,提问作者bajirao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 11:00:54