news 2026/1/25 10:36:44

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/1/23 4:51:13

5大平台高效采集:多媒体数据采集全攻略

5大平台高效采集&#xff1a;多媒体数据采集全攻略 【免费下载链接】MediaCrawler-new 项目地址: https://gitcode.com/GitHub_Trending/me/MediaCrawler-new 在数字化时代&#xff0c;多媒体数据已成为内容创作、市场分析和学术研究的核心资源。然而&#xff0c;跨平台…

作者头像 李华
网站建设 2026/1/23 4:51:09

数字管家Czkawka:让你的磁盘空间不再“打嗝“

数字管家Czkawka&#xff1a;让你的磁盘空间不再"打嗝" 【免费下载链接】czkawka 一款跨平台的重复文件查找工具&#xff0c;可用于清理硬盘中的重复文件、相似图片、零字节文件等。它以高效、易用为特点&#xff0c;帮助用户释放存储空间。 项目地址: https://git…

作者头像 李华
网站建设 2026/1/23 4:51:04

fft npainting lama支持透明通道吗?Alpha层处理实测

fft npainting lama支持透明通道吗&#xff1f;Alpha层处理实测 1. 引言&#xff1a;图像修复中的透明通道需求 在图像编辑和内容创作中&#xff0c;我们经常遇到需要保留或处理透明背景的场景。比如设计Logo、制作贴纸、UI元素抠图等&#xff0c;这些工作都依赖PNG格式的Alp…

作者头像 李华
网站建设 2026/1/23 4:50:49

开箱即用!BERT镜像让中文文本处理效率提升3倍

开箱即用&#xff01;BERT镜像让中文文本处理效率提升3倍 1. 为什么你需要一个高效的中文语义理解工具&#xff1f; 你有没有遇到过这样的场景&#xff1a;写文章时卡在一个成语上&#xff0c;怎么都想不起下一句&#xff1f;或者审校文案时发现句子不通顺&#xff0c;但又说…

作者头像 李华
网站建设 2026/1/23 4:50:37

突破3大瓶颈:如何用分布式架构实现万级加密货币实时预测?

突破3大瓶颈&#xff1a;如何用分布式架构实现万级加密货币实时预测&#xff1f; 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 当你的量化系统在加密货币…

作者头像 李华
网站建设 2026/1/23 4:50:20

Cute_Animal_For_Kids_Qwen_Image灰度发布:渐进式上线方案

Cute_Animal_For_Kids_Qwen_Image灰度发布&#xff1a;渐进式上线方案 你有没有试过&#xff0c;孩子指着绘本里的一只小狐狸说“我也想要一只会跳舞的粉鼻子狐狸”&#xff0c;然后你翻遍所有绘图工具却找不到合适的风格&#xff1f;或者美术老师想为低龄班准备一批安全、温暖…

作者头像 李华