windows下用getvolumeinformation判断光盘介质类型最可靠:先提取路径根目录(如"d:"),调用getvolumeinformation检查file_read_only_volume标志及文件系统名是否为"cdfs"或"udf",并需配合getdrivetype确认驱动器类型为drive_cdrom。

Windows下用GetVolumeInformation判断光盘介质类型
直接调用GetVolumeInformation是最快、最可靠的方案。它能区分CD-ROM、DVD-ROM等只读光学介质,也能识别ISO镜像挂载后的虚拟光驱(前提是镜像已通过系统挂载为驱动器,如D:)。
关键不是看路径字符串是否含“.iso”,而是看其所在卷的文件系统特征和属性:
-
GetVolumeInformation返回的dwFileSystemFlags中,FILE_READ_ONLY_VOLUME标志表示该卷整体只读(光盘典型特征) -
lpFileSystemNameBuffer返回值常为"CDFS"(CD-ROM File System)或"UDF"(通用光碟格式),而非"NTFS"或"exFAT" - 需先用
GetDriveType确认路径所在驱动器是DRIVE_CDROM,否则GetVolumeInformation可能成功但结果无意义
示例:对路径"D:\photo.jpg",先提取根目录"D:\",再调用:
DWORD dwFlags;
GetVolumeInformation(L"D:\", nullptr, 0, nullptr, nullptr, &dwFlags, nullptr, 0);
if (dwFlags & FILE_READ_ONLY_VOLUME) { /* 很可能是光盘或只读镜像 */ }
Linux下用statfs + ioctl检查光驱设备属性
Linux没有统一“只读光盘”抽象,必须分两步:先确认挂载点底层设备是否为光驱,再验证其只读状态。
常见错误是仅依赖statfs返回的f_flag & ST_RDONLY——这只能说明挂载选项为只读,不能区分是光盘本身只读还是人为mount -o ro挂载了U盘。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
stat获取路径对应设备号(st_dev),再查/sys/dev/block/{major}:{minor}/device下的ro文件内容是否为"1" - 更稳妥的是调用
ioctl(fd, CDROM_GET_CAPABILITY, &cap)(需打开/dev/sr0等光驱设备),成功即表明是真实光驱 - 对于ISO镜像,若用
mount -o loop挂载,ro文件仍为"1",但CDROM_GET_CAPABILITY会失败——此时可结合/proc/mounts中是否含"loop"字段辅助判断
跨平台时别碰路径后缀和文件权限位
靠检查路径是否含".iso"或".img"后缀完全不可靠:用户可能把ISO重命名为"data.bin",也可能把普通文件放在光盘里并命名为"project.cpp"。
同样,access(path, W_OK)或std::filesystem::is_writable()返回false也不等于“是光盘”——网络共享、加密容器、权限受限目录都会触发相同结果。
- Windows上
GetFileAttributes返回FILE_ATTRIBUTE_READONLY只是文件级属性,光盘上新建文件夹也常带此标记,但不反映介质本质 - Linux上
stat.st_mode & S_IWUSR为0同样无法区分介质类型,只说明当前用户无写权限
虚拟光驱和弹出式介质的边界情况
现代系统中,很多“光盘”其实是虚拟光驱软件(如Daemon Tools、WinCDEmu)挂载的内存镜像,它们在Windows上表现为DRIVE_CDROM且FILE_READ_ONLY_VOLUME置位,行为与物理光盘一致;但在Linux上可能映射为loop设备,CDROM_GET_CAPABILITY会失败。
真正容易漏判的是可擦写光盘(CD-RW/DVD-RW):当盘片为空或未格式化时,GetVolumeInformation可能返回FILE_SUPPORTS_COMPRESSION但不设FILE_READ_ONLY_VOLUME,此时需额外调用DeviceIoControl(Windows)或ioctl(fd, CDROM_DISC_STATUS)(Linux)查询实际盘片状态。
这类细节往往被忽略——程序只测了空白CD-R,没试过已刻录的DVD-ROM,也没覆盖DVD-RAM这种半只读半可写的混合场景。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










