c++如何创建一个指定大小的稀疏文件_Windows下FSCTL_SET_SPARSE【实战】

稀疏文件是操作系统标记逻辑存在但物理未分配区域的文件,需调用FSCTL_SET_SPARSE显式启用:文件须以GENERIC_WRITE打开、已存在且非压缩/加密,DeviceIoControl需传有效FILE_SET_SPARSE_BUFFER结构体。什么是稀疏文件,为什么 Windows 下要用 FSCTL_SET_SPARSE稀疏文件不是"空文件",而是操作系统层面标记出某些区域"逻辑存在但物理未分配"的文件。它节省磁盘空间,适合日志归档、虚拟磁盘镜像、大数据占位等场景。Windows 不会自动创建稀疏文件,必须显式调用 FSCTL_SET_SPARSE 控制码开启稀疏属性,否则即使你用 SetFilePointerEx 跳过一大段再写,NTFS 仍会把中间全填零并实际分配空间。调用 FSCTL_SET_SPARSE 的前置条件和关键步骤必须满足三个硬性条件,缺一不可:文件句柄需以 GENERIC_WRITE 打开,且不能带 FILE_ATTRIBUTE_COMPRESSED文件必须已存在(不能是刚 CreateFile 出来的空句柄,得先写点内容或至少 SetEndOfFile 拉长)调用前需确保文件处于非压缩、非加密状态(GetFileAttributes 返回不含 FILE_ATTRIBUTE_COMPRESSED 或 FILE_ATTRIBUTE_ENCRYPTED)实操建议:先 CreateFile 创建文件 → SetEndOfFile 设定目标大小 → 关闭句柄 → 重新以可写方式打开 → 再发 FSCTL_SET_SPARSE。跳过"先设大小再开句柄"这步,90% 会返回 ERROR_INVALID_PARAMETER。DeviceIoControl 发送 FSCTL_SET_SPARSE 的最小安全写法别直接传空结构体------Windows 要求提供一个非 NULL 的 FILE_SET_SPARSE_BUFFER 指针,哪怕里面 SetSparse 字段为 TRUE 就行。常见错误是传了 NULL 或栈上未初始化的结构,导致调用失败并返回 ERROR_INVALID_USER_BUFFER。立即学习"C++免费学习笔记(深入)"; 文小言 百度旗下新搜索智能助手,有问题,问小言。

相关推荐
Decay__1 小时前
05_MySQL 常用 SQL 大全 —— 诊断、管理、优化辅助 SQL 与三大系统库速查
运维·数据库·sql·mysql·架构
代码山河3 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行3 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者4 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
小徐不徐说5 小时前
C++ 接口与插件设计:从工厂注册到 Qt 动态插件
数据库·c++·qt·系统架构·程序设计
“AI国潮设计-小江”6 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
论文复现现场6 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
benchmark_cc7 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读7 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
Decay__7 小时前
04_MySQL DBA 日常运维手册 —— 会话管理、锁与阻塞、事务监控、慢查询与日志巡检
运维·数据库·sql·mysql·架构