c++怎么在不使用STL的情况下利用Win32 API进行低级文件IO【底层】

张开发
2026/4/14 0:01:43 15 分钟阅读

分享文章

c++怎么在不使用STL的情况下利用Win32 API进行低级文件IO【底层】
FILE_FLAG_NO_BUFFERING并非真正“底层”仅绕过系统缓存实现低级IO需满足缓冲区地址、读写大小及文件偏移均按扇区对齐如4096字节且须用VirtualAlloc等分配对齐内存否则ReadFile会返回ERROR_INVALID_PARAMETER。用 CreateFile 打开文件时FILE_FLAG_NO_BUFFERING 真的等于“底层”吗不是。它只是绕过系统缓存不等于跳过内核、不等于直接和磁盘对话。真正低级 IO 的关键不在标志位而在你能否控制对齐、缓冲区地址、读写粒度——这些全由 CreateFile 返回的句柄 ReadFile/WriteFile 决定。常见错误开了 FILE_FLAG_NO_BUFFERING 却用普通 malloc 分配缓冲区结果 ReadFile 直接失败并返回 ERROR_INVALID_PARAMETER。缓冲区地址必须是磁盘扇区大小通常是 512 或 4096对齐的推荐用 VirtualAlloc返回页面对齐地址或 _aligned_malloc需手动指定对齐值每次读写字节数必须是扇区大小的整数倍偏移量lpOverlapped-Offset也必须对齐文件必须以 CREATE_ALWAYS 或 OPEN_EXISTING 打开且不能是 CONIN$ 或管道等伪设备ReadFile 和 WriteFile 在非重叠模式下为什么有时“卡住”因为它们默认是同步阻塞的——但“卡”的真实原因是文件句柄没设成 FILE_ATTRIBUTE_NORMAL 或被其他进程独占或者你试图读一个刚创建但还没落盘的文件尤其在 FILE_FLAG_NO_BUFFERING 下更敏感。使用场景做日志批量写入、内存映射前预分配、或对接硬件驱动时需要确定性延迟和可控的完成时机。立即学习“C免费学习笔记深入”确保打开时用了 GENERIC_READ | GENERIC_WRITE且没有漏掉 FILE_SHARE_READ | FILE_SHARE_WRITE除非你真要独占检查返回值ReadFile 返回 FALSE 时立刻调 GetLastError()常见错误如 ERROR_HANDLE_EOF读到尾、ERROR_IO_PENDING误用了重叠句柄却没传 OVERLAPPED非重叠模式下lpNumberOfBytesRead 参数不可为 NULL否则行为未定义不用 std::vector怎么安全管理动态缓冲区Win32 本身不提供容器但你可以用 VirtualAlloc VirtualFree 搭配手动长度跟踪比 new[] 更贴近底层控制意图——毕竟页对齐、可设保护属性、能跨进程共享配合 SEC_COMMIT。 唱鸭 音乐创作全流程的AI自动作曲工具集 AI 辅助作词、AI 自动作曲、编曲、混音于一体

更多文章