讲师中心 微信公众号

工具推荐

视频效率加速
立刻MV
立刻MV

低成本歌曲 MV、视频生成

剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

AniShort
AniShort

AI短剧协同制作平台

c++在Windows下如何使用CreateFile读写文件_Win32 API【详解】

阿磊大大_5182

阿磊大大_5182

发布时间:2026-03-20 23:21:32

|

573人浏览过

|

来源于php中文网

原创

最常见原因是路径字符串未正确处理:Windows API 不接受正斜杠,需用双反斜杠和宽字符(L"..."),并统一调用 CreateFileW;错误码需用 GetLastError() 检查,如 ERROR_PATH_NOT_FOUND 或 ERROR_ACCESS_DENIED。

c++在windows下如何使用createfile读写文件_win32 api【详解】

为什么 CreateFile 打开文件总是返回 INVALID_HANDLE_VALUE

最常见原因是路径字符串没处理好——Windows API 默认不接受正斜杠 /,也不自动补全当前目录,且 Unicode 路径必须用宽字符(L"...")传入。如果用窄字符串("...")调用 CreateFileA,而路径含中文或特殊符号,大概率失败;若调用 CreateFileW 却传 char*,会把字节当 wchar_t 解释,直接越界。

实操建议:

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 统一用 CreateFileW,路径写成 L"C:\temp\data.bin" —— 反斜杠双写,开头加 L
  • 避免拼接路径:不要用 std::string + .c_str() 传给 CreateFileW;改用 std::wstring 或 std::filesystem::path 的 c_str()
  • 检查错误码:调用后立刻 GetLastError(),常见值如 ERROR_PATH_NOT_FOUND(目录不存在)、ERROR_ACCESS_DENIED(权限不足,尤其系统目录或正在被其他进程占用)

CreateFile 的 dwCreationDisposition 参数怎么选才不丢数据

这个参数决定文件不存在时是否创建、存在时是否清空,选错会导致覆盖或写入失败。比如想追加日志却用了 CREATE_ALWAYS,每次打开都清空旧内容;想读配置却用了 OPEN_ALWAYS,文件不存在时会新建一个空文件,掩盖了“配置缺失”的问题。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 只读场景:用 OPEN_EXISTING —— 文件必须存在,否则失败,适合配置文件、资源加载
  • 写新文件(不覆盖):用 CREATE_NEW —— 文件已存在则失败,避免误覆盖
  • 覆盖写:用 CREATE_ALWAYS —— 总是清空重来,适合缓存、临时输出
  • 追加写:先用 OPEN_EXISTING 打开,再用 SetFilePointer 移到末尾,最后 WriteFile;别依赖 FILE_APPEND_DATA 权限自动定位——它只保证写入位置在末尾,但并发写时仍可能冲突

用 CreateFile 读写二进制文件时,ReadFile/WriteFile 返回值为 0 却没报错

这通常不是函数失败,而是同步 I/O 在文件末尾或缓冲区空时的正常行为。但更隐蔽的问题是:你传给 ReadFile 的缓冲区地址非法、大小为 0,或句柄没开对读/写权限(比如用 GENERIC_READ 打开却调 WriteFile),此时函数直接返回 FALSE,但 GetLastError() 可能还是 0(未设置),容易误判。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 检查句柄权限:打开时指定的 dwDesiredAccess 必须包含对应操作权限,GENERIC_READ | GENERIC_WRITE 不等于“啥都能干”,得看实际需要
  • 确认缓冲区有效:lpBuffer 不能是栈上即将销毁的局部数组(比如函数返回后指针悬空),大小不能为 0
  • 同步读写必须检查返回值:ReadFile 返回 TRUE 才代表成功,FALSE 时必须调 GetLastError();即使返回 TRUE,也要看 lpNumberOfBytesRead 是否等于预期——读到 EOF 时它可能小于请求长度

用 CreateFile 打开串口或命名管道时,为什么超时设置不起作用

因为 CreateFile 本身不控制 I/O 超时,它只负责打开设备。串口和管道的读写超时由后续的 SetCommTimeouts(串口)或 SetNamedPipeHandleState(管道)控制。如果跳过这步,ReadFile 可能永远阻塞,哪怕你设置了 FILE_FLAG_OVERLAPPED,异步操作也需配套的事件/完成端口机制才能响应超时。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 串口:打开后立即调 SetCommTimeouts,填 COMMTIMEOUTS 结构体,重点设 ReadTotalTimeoutConstant
  • 命名管道:用 CreateFile 打开客户端句柄后,服务端需用 ConnectNamedPipe,并在之前用 SetNamedPipeHandleState 设置 PIPE_WAIT 和超时
  • 别混淆标志位:FILE_FLAG_OVERLAPPED 是启用异步 I/O 的前提,但不等于“自动超时”;没配超时参数的异步读写,照样可能卡在 GetOverlappedResult 等待中
事情说清了就结束。真正难的不是记住每个参数名,而是每次打开前,心里得清楚:我要的是原子性、还是并发安全?要不要跨进程共享?出错时该重试还是直接放弃?这些判断没法靠查文档解决。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

7519

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1938

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3184

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6384

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6549

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

8074

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

12534

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

6499

2025.07.29

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn