如何通过Windows卷序列号编程获取卷名称/标签?
通过卷序列号获取对应卷标签的实现方法
由于Windows没有直接通过卷序列号查询卷标签的API,我们可以通过枚举所有挂载卷并逐一匹配序列号的方式实现,具体步骤如下:
枚举系统所有卷的根路径
使用GetLogicalDriveStrings函数获取系统中所有已挂载的驱动器根路径(如C:\、D:\)。逐个获取卷的信息
对每个根路径,调用GetVolumeInformationW函数,获取该卷的序列号和卷标签。匹配目标序列号
将获取到的卷序列号与目标序列号对比,匹配成功时即可得到对应的卷标签。
示例代码(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
相关产品推荐
相关产品推荐

