c++如何获取当前磁盘的卷标和序列号_GetVolumeInformation【详解】

夏芳姑娘_2953

夏芳姑娘_2953

2026-03-23

1033人浏览

原创

getvolumeinformation 调用失败返回0且getlasterror为123,主因是路径非标准根目录格式(如缺结尾双反斜杠)、缓冲区为空或路径无效;卷序列号为0可能因系统禁用生成策略或非ntfs/fat文件系统。

c++如何获取当前磁盘的卷标和序列号_getvolumeinformation【详解】

GetVolumeInformation 调用失败返回 0, GetLastError 是 123?

常见错误是传入了非法路径或权限不足,但更隐蔽的是路径末尾带不带反斜杠——GetVolumeInformation 要求路径必须是根目录格式(如 "C:\"),写成 "C:" 或 "C:\temp" 都会触发错误 123(ERROR_INVALID_NAME)。

实操建议:

  • 确保传入的 lpRootPathName 是完整根路径,结尾双反斜杠:用 "C:\\" 而不是 "C:"
  • 不要传入空指针:即使你只想要序列号,lpVolumeNameBuffer 和 lpFileSystemNameBuffer 也得给非空缓冲区(哪怕只传 nullptr 也要配对设 0)
  • 调用前检查路径是否存在且可访问:GetDriveType("C:\") != DRIVE_NO_ROOT_DIR

卷标能读出来,但序列号总是 0x00000000?

这不是 API 失败,而是 Windows 默认关闭了“卷序列号生成”策略(尤其在某些企业镜像或精简版系统中)。GetVolumeInformation 返回的 lpVolumeSerialNumber 是 32 位整数,低位在前,高位在后,但若底层没启用,它就真为 0。

实操建议:

  • 确认是否真为 0:打印时用 printf("%08X", *lpVolumeSerialNumber),别只看十进制 0
  • 序列号由 NTFS/FAT 元数据决定,格式化时生成;若磁盘是动态卷、BitLocker 加密卷或 ReFS,行为可能不同
  • 不依赖序列号做唯一标识:它可能重复(克隆系统)、可被修改(vol /N C: 只改卷标,但 format /q 重置序列号),更适合辅助校验

用 C++ 封装 GetVolumeInformation 的最小安全调用

绕开手动管理缓冲区和字符编码陷阱,推荐用宽字符接口 + std::wstring,避免 ANSI 版本在中文卷标下截断。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

  • 始终用 GetVolumeInformationW,传入 std::wstring(L"C:\\")
  • 卷标缓冲区至少留 256 个 wchar_t,因为长卷标+Unicode 组合字符可能占多个码元
  • 捕获错误要立刻调用 GetLastError(),不能穿插其他 Win32 调用,否则会被覆盖
  • 示例关键片段:
DWORD serial = 0, maxCompLen = 0, fsFlags = 0;
std::wstring volName(256, L''), fsName(256, L'');
if (!GetVolumeInformationW(L"C:\\", &volName[0], volName.size(), &serial,
                           &maxCompLen, &fsFlags, &fsName[0], fsName.size())) {
    DWORD err = GetLastError(); // 立即取
    // 处理 err
}
volName.resize(wcslen(volName.c_str())); // 去掉多余 

跨平台替代方案为什么不用 GetVolumeInformation?

它只在 Windows 生效,且需要管理员权限才能读取某些加密卷信息;Linux/macOS 下根本没有等价函数。如果项目目标是多平台,硬绑 GetVolumeInformation 会让后续迁移成本陡增。

实操建议:

  • 提取逻辑层:定义接口如 get_volume_id(const std::string& path),Windows 实现调 GetVolumeInformation,Linux 走 statfs + ioctl(BLKGETSIZE64),macOS 用 getattrlist
  • 注意序列号语义差异:Windows 卷序列号是格式化时生成的 32 位值;Linux 的 filesystem UUID 是 128 位,存储在 superblock 中,更稳定
  • 别在构建脚本里硬编码 #ifdef _WIN32 —— 把平台相关代码隔离到 .cpp 文件,头文件只暴露统一签名

真正麻烦的不是调用 API,而是假设“卷标+序列号=磁盘唯一身份”。它们都可能被用户或工具修改,甚至同一物理盘挂载两次(比如 WSL2 和宿主机共用 NTFS 分区)会看到不同视图。需要唯一性,得结合硬件 ID、分区起始扇区、或上层业务逻辑补全。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5999

3

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.06.27

1211

7

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

748

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1009

10

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2023.09.20

2118

7

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

339

31

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3128

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4709

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习