news 2026/5/1 9:19:03

C++:用WriteFile函数写文件(附带源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++:用WriteFile函数写文件(附带源码)

一、项目背景详细介绍

在 Windows 平台的 C++ 工程开发中,除了使用C++ 标准文件流(fstream,我们还经常会直接使用Windows API来进行底层文件操作。

其中,WriteFile是 Windows 平台上:

最核心、最底层、最常用的文件写入 API

典型应用场景包括:

  • 高性能日志系统

  • 驱动 / 服务程序

  • Windows 专用工具

  • 与 C 运行库(CRT)解耦的程序

  • 大文件、高频写入场景

  • ReadFile对应的二进制 I/O

  • 网络 / 管道 / 设备文件写入

std::ofstream相比,WriteFile具有以下特点:

对比项WriteFilefstream
平台Windows 专用跨平台
层级操作系统 APIC++ 抽象
性能更高略低
控制力极强一般
用途工程 / 系统级应用级

本项目将系统性讲解

如何在 C++ 中使用 Windows 的 WriteFile 函数安全、正确地写文件


二、项目需求详细介绍

2.1 功能性需求

  1. 使用 Windows API 创建 / 打开文件

  2. 使用WriteFile写入数据

  3. 支持文本与二进制数据

  4. 正确处理返回值与错误

  5. 确保资源正确释放


2.2 非功能性需求

  • 仅依赖 Windows API(<Windows.h>

  • 不使用 C++ 文件流

  • 不依赖第三方库

  • 代码清晰、注释完整

  • 工程可直接复用


2.3 平台说明

⚠️ 本项目仅适用于 Windows 平台


三、相关技术详细介绍

3.1 Windows 文件句柄(HANDLE)

在 Windows API 中:

  • 文件不是“对象”

  • 而是通过句柄(HANDLE)操作

文件操作流程通常为:

CreateFile → WriteFile → CloseHandle


3.2CreateFile简要说明

HANDLE CreateFile( LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );

常用参数:

  • GENERIC_WRITE:写权限

  • CREATE_ALWAYS:不存在则创建,存在则覆盖

  • OPEN_ALWAYS:不存在则创建,存在则打开


3.3WriteFile函数原型

BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );

关键点:

  • 写入的是字节

  • 返回值表示是否成功

  • 实际写入字节数通过指针返回


四、实现思路详细介绍

整体实现步骤如下:

  1. 使用CreateFile打开 / 创建文件

  2. 准备待写入的数据缓冲区

  3. 调用WriteFile写入数据

  4. 检查返回值与写入字节数

  5. 使用CloseHandle关闭文件

该方式:

  • 不受文本 / 二进制影响

  • 不进行任何编码转换

  • 工程行为完全可控


五、完整实现代码

/******************************************************** * 文件名:write_file_winapi.cpp * 功能:使用 Windows API 的 WriteFile 函数写文件 * 说明: * 1. 使用 CreateFile 创建/打开文件 * 2. 使用 WriteFile 写入数据 * 3. 使用 CloseHandle 释放资源 ********************************************************/ #include <windows.h> #include <iostream> #include <string> /** * @brief 使用 WriteFile 写文件 * @param fileName 文件路径 * @param data 要写入的数据 * @return true 写入成功,false 写入失败 */ bool writeFileByWinAPI(const std::string& fileName, const std::string& data) { // 创建或覆盖文件 HANDLE hFile = CreateFileA( fileName.c_str(), // 文件路径 GENERIC_WRITE, // 写权限 0, // 不共享 NULL, // 默认安全属性 CREATE_ALWAYS, // 存在则覆盖,不存在则创建 FILE_ATTRIBUTE_NORMAL, // 普通文件 NULL // 模板文件 ); if (hFile == INVALID_HANDLE_VALUE) { std::cerr << "CreateFile 失败,错误码:" << GetLastError() << std::endl; return false; } DWORD bytesWritten = 0; // 写入数据 BOOL result = WriteFile( hFile, // 文件句柄 data.c_str(), // 数据缓冲区 static_cast<DWORD>(data.size()), // 写入字节数 &bytesWritten, // 实际写入字节数 NULL // 同步写入 ); if (!result) { std::cerr << "WriteFile 失败,错误码:" << GetLastError() << std::endl; CloseHandle(hFile); return false; } // 校验写入字节数 if (bytesWritten != data.size()) { std::cerr << "写入字节数不完整!" << std::endl; CloseHandle(hFile); return false; } // 关闭文件句柄 CloseHandle(hFile); return true; } int main() { std::string fileName = "winapi_test.txt"; std::string content = "Hello Windows WriteFile!\r\n第二行内容"; if (writeFileByWinAPI(fileName, content)) { std::cout << "WriteFile 写文件成功!" << std::endl; } else { std::cout << "WriteFile 写文件失败!" << std::endl; } return 0; }

六、代码详细解读(仅解读方法作用)

6.1writeFileByWinAPI

  • 使用CreateFileA创建 / 打开文件

  • 调用WriteFile将字节数据写入文件

  • 通过bytesWritten校验写入完整性

  • 使用CloseHandle释放系统资源


6.2main函数

  • 构造测试文件名与写入内容

  • 调用封装好的写文件函数

  • 输出执行结果


七、项目详细总结

通过该项目,你已经系统掌握:

  • Windows 文件句柄(HANDLE)的概念

  • CreateFile/WriteFile/CloseHandle的标准用法

  • Windows API 写文件的完整流程

  • 如何进行错误码检查与工程级校验

  • Windows 底层文件 I/O 的正确打开方式

该实现:

  • 性能高

  • 控制力强

  • 工程实战性极高

  • 适合系统级与工具级程序


八、项目常见问题及解答

Q1:WriteFile 能写二进制文件吗?

可以。
WriteFile永远以字节为单位。


Q2:是否会进行编码转换?

不会。
写什么字节,就存什么字节。


Q3:为什么要手动判断bytesWritten

因为 API 只保证“尽力写”,
工程中必须校验完整性。


Q4:与ofstream相比有什么优势?

  • 更高性能

  • 更底层控制

  • 可用于设备、管道、Socket


九、扩展方向与性能优化

9.1 使用WriteFile写二进制结构体

9.2 配合ReadFile实现完整文件复制

9.3 使用 Overlapped I/O(异步写入)

9.4 写入大文件分块优化

9.5 封装 Windows 专用 FileUtils 工具库

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 5:00:03

如何用OpenCore Legacy Patcher让老旧Mac重获新生:2024系统指南

如何用OpenCore Legacy Patcher让老旧Mac重获新生&#xff1a;2024系统指南 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当苹果官方停止对2012年及更早Mac设备的系统更…

作者头像 李华
网站建设 2026/5/1 6:07:17

零门槛跨系统体验:macOS虚拟机新手指南

零门槛跨系统体验&#xff1a;macOS虚拟机新手指南 【免费下载链接】OneClick-macOS-Simple-KVM Tools to set up a easy, quick macOS VM in QEMU, accelerated by KVM. Works on Linux AND Windows. 项目地址: https://gitcode.com/gh_mirrors/on/OneClick-macOS-Simple-KV…

作者头像 李华
网站建设 2026/5/1 5:04:25

轻松提取音频特征向量!Emotion2Vec+ Embedding功能详解

轻松提取音频特征向量&#xff01;Emotion2Vec Embedding功能详解 1. 引言&#xff1a;为什么我们需要音频特征向量&#xff1f; 你有没有想过&#xff0c;一段语音除了能听出“开心”还是“难过”&#xff0c;还能告诉我们更多&#xff1f;比如它的情绪强度、说话人的状态&a…

作者头像 李华
网站建设 2026/5/1 7:16:54

Qwen All-in-One镜像推荐:无需GPU的轻量AI服务部署教程

Qwen All-in-One镜像推荐&#xff1a;无需GPU的轻量AI服务部署教程 1. 为什么你需要一个“不用GPU也能跑”的AI服务&#xff1f; 你是不是也遇到过这些情况&#xff1f; 想在公司老旧的办公电脑上试个AI功能&#xff0c;结果卡在“CUDA out of memory”&#xff1b; 想给客户…

作者头像 李华
网站建设 2026/4/30 15:12:11

帧级 vs 整句级情感分析?科哥镜像两种模式使用场景解析

帧级 vs 整句级情感分析&#xff1f;科哥镜像两种模式使用场景解析 1. 为什么粒度选择决定分析质量&#xff1f; 你上传一段30秒的客服录音&#xff0c;系统返回一个“中性”标签——这真的准确吗&#xff1f; 还是说&#xff0c;前5秒客户语气平和&#xff0c;中间10秒突然提…

作者头像 李华
网站建设 2026/5/1 6:00:49

Llama3-8B游戏NPC对话设计:互动系统搭建详细步骤

Llama3-8B游戏NPC对话设计&#xff1a;互动系统搭建详细步骤 1. 为什么选Llama3-8B做游戏NPC&#xff1f; 你有没有想过&#xff0c;游戏里的NPC不再只会重复三句话&#xff1f;当玩家问“昨晚的月色真美&#xff0c;你觉得呢”&#xff0c;它能接一句带点诗意又符合角色性格…

作者头像 李华