2026/6/20 7:35:37
网站建设
项目流程
微网站如何建设方案,网站优化排名工具,嵌入式工程师能干多久,个人 做自媒体 建网站一、项目背景详细介绍在 Windows 平台的 C 工程开发中#xff0c;除了使用 C 标准文件流#xff08;fstream#xff09;#xff0c;我们还经常会直接使用 Windows API 来进行底层文件操作。其中#xff0c;WriteFile 是 Windows 平台上#xff1a;最核心、最底层、最常用…一、项目背景详细介绍在 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 功能性需求使用 Windows API 创建 / 打开文件使用WriteFile写入数据支持文本与二进制数据正确处理返回值与错误确保资源正确释放2.2 非功能性需求仅依赖 Windows APIWindows.h不使用 C 文件流不依赖第三方库代码清晰、注释完整工程可直接复用2.3 平台说明⚠️ 本项目仅适用于 Windows 平台三、相关技术详细介绍3.1 Windows 文件句柄HANDLE在 Windows API 中文件不是“对象”而是通过句柄HANDLE操作文件操作流程通常为CreateFile → WriteFile → CloseHandle3.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 );关键点写入的是字节返回值表示是否成功实际写入字节数通过指针返回四、实现思路详细介绍整体实现步骤如下使用CreateFile打开 / 创建文件准备待写入的数据缓冲区调用WriteFile写入数据检查返回值与写入字节数使用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_castDWORD(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 的正确打开方式该实现性能高控制力强工程实战性极高适合系统级与工具级程序八、项目常见问题及解答Q1WriteFile 能写二进制文件吗可以。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 工具库