【C语言】CreateFile函数用法介绍
目录
一、函数原型与基本功能
二、参数详解
1. lpFileName(文件路径)
2. dwDesiredAccess(访问权限)
补充说明
5. dwCreationDisposition(创建策略)
6. dwFlagsAndAttributes(属性标记)
7. hTemplateFile(模板文件句柄)
三、返回值与错误处理
四、使用场景示例
场景1:创建新文本文件
场景2:异步读取串口数据
五、扩展注意事项
CreateFile函数是Windows API中用于文件/设备操作的核心接口,支持创建、打开文件及多种I/O设备(如串口、管道、磁盘等)。本文将详细介绍。
一、函数原型与基本功能
HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDisposition,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile
);
该函数返回对象的操作句柄,失败时返回INVALID_HANDLE_VALUE
(需用GetLastError()
获取错误码)。
二、参数详解
1. lpFileName(文件路径)
- 作用:指定操作对象的名称(文件、设备、命名管道等)
- 特性:
- 支持绝对/相对路径,可用
/
或\
分隔符 - 最大长度限制为
MAX_PATH
(260字符),Unicode版本可突破此限制 - 特殊设备名如
COM1
(串口)、LPT1
(并口)需遵循MS-DOS设备命名规则
- 支持绝对/相对路径,可用
2. dwDesiredAccess(访问权限)
以下是 CreateFile
函数中 dwDesiredAccess
参数的可能值、用途、适用场景及组合使用的详细表格总结:
参数值 | 用途 | 适用场景 | 组合使用示例 |
---|---|---|---|
0 | 仅允许查询元数据(如属性、大小),不进行实际读写操作 | 获取文件信息(GetFileSize 、GetFileTime )时无需读写权限 | 单独使用 |
GENERIC_READ | 允许读取文件或设备数据,支持移动文件指针 | 读取文件内容(ReadFile )、查看日志、复制文件 | GENERIC_READ | GENERIC_WRITE (读写权限组合) |
GENERIC_WRITE | 允许写入数据,支持移动文件指针或调整文件大小 | 写入文件(WriteFile )、修改设备配置(如串口通信) | GENERIC_READ | GENERIC_WRITE (常见组合)、GENERIC_WRITE | GENERIC_ALL |
GENERIC_EXECUTE | 保留值,通常用于可执行文件或驱动程序的执行权限(需设备支持) | 注册表操作、可执行文件加载(实际文件操作中较少使用) | 通常单独使用,需参考具体设备文档 |
GENERIC_ALL | 授予完全控制权限(读、写、执行、删除),需配合安全描述符使用 | 管理员操作(修改系统文件、磁盘格式化) | 单独使用或与 0 组合(查询元数据 + 完全控制) |
补充说明
- 权限冲突:若请求的访问权限与
dwShareMode
参数指定的共享模式冲突,函数将返回ERROR_SHARING_VIOLATION
。 - 设备兼容性:如串口设备通常需同时指定
GENERIC_READ \| GENERIC_WRITE
以支持双向通信。 - 特殊权限要求:
GENERIC_ALL
需管理员权限或安全描述符支持,否则可能失败。
3. dwShareMode(共享模式)
控制其他进程的并发访问权限:
值 | 说明 |
---|---|
FILE_SHARE_READ | 允许其他进程读取 |
FILE_SHARE_WRITE | 允许其他进程写入 |
FILE_SHARE_DELETE | 允许其他进程删除或重命名(需NTFS支持)3 |
0 | 独占模式,阻止其他进程访问 |
4. lpSecurityAttributes(安全属性)
结构体:
typedef struct _SECURITY_ATTRIBUTES {DWORD nLength;LPVOID lpSecurityDescriptor;BOOL bInheritHandle;
} SECURITY_ATTRIBUTES;
作用:
bInheritHandle
:控制句柄是否被子进程继承lpSecurityDescriptor
:设置NTFS权限(需管理员权限)
5. dwCreationDisposition(创建策略)
决定文件存在与否时的处理方式:
值 | 行为 |
---|---|
CREATE_NEW | 新建文件,若存在则失败 |
CREATE_ALWAYS | 覆盖已有文件(清空属性) |
OPEN_EXISTING | 打开已存在文件(不存在则失败) |
OPEN_ALWAYS | 文件存在时打开,否则创建 |
TRUNCATE_EXISTING | 截断已有文件(需GENERIC_WRITE 权限) |
6. dwFlagsAndAttributes(属性标记)
包含文件属性与操作标志的位组合:
- 常见文件属性:
属性 说明 FILE_ATTRIBUTE_HIDDEN
隐藏文件 FILE_ATTRIBUTE_READONLY
只读文件 FILE_ATTRIBUTE_TEMPORARY
临时文件(优先内存缓存)1 - 操作标志:
标志 说明 FILE_FLAG_OVERLAPPED
启用异步I/O操作 FILE_FLAG_DELETE_ON_CLOSE
关闭后自动删除
7. hTemplateFile(模板文件句柄)
- 作用:复制已有文件的扩展属性(如创建时间、压缩标志)
- 限制:仅当
dwCreationDisposition
为CREATE_NEW
或OPEN_ALWAYS
时生效8
三、返回值与错误处理
- 成功时:返回有效的句柄(需用
CloseHandle()
关闭) - 失败时:返回
INVALID_HANDLE_VALUE
(值为-1
)- 典型错误码:
错误码 说明 ERROR_FILE_NOT_FOUND
文件不存在且未指定创建策略 ERROR_ACCESS_DENIED
权限不足或文件被占用 ERROR_SHARING_VIOLATION
共享模式与其他进程冲突3
- 典型错误码:
四、使用场景示例
场景1:创建新文本文件
HANDLE hFile = CreateFile(L"example.txt", // 文件名GENERIC_WRITE, // 写权限0, // 独占模式NULL, // 默认安全属性CREATE_ALWAYS, // 覆盖创建FILE_ATTRIBUTE_NORMAL, // 普通文件NULL
);
场景2:异步读取串口数据
HANDLE hCom = CreateFile(L"COM1", // 串口设备GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, // 异步模式NULL
);
五、扩展注意事项
- 句柄泄漏:必须通过
CloseHandle()
释放资源,否则导致系统资源耗尽 - 路径规范化:建议使用
\\?\
前缀绕过MAX_PATH
限制(仅Unicode版本) - 事务操作:需使用
CreateFileTransacted()
实现原子文件操作3 - 设备兼容性:部分标志(如
FILE_FLAG_NO_BUFFERING
)对物理磁盘有特殊要求
(完整参数列表及系统级限制可参考Microsoft官方文档)
相关文章:
【C语言】CreateFile函数用法介绍
目录 一、函数原型与基本功能 二、参数详解 1. lpFileName(文件路径) 2. dwDesiredAccess(访问权限) 补充说明 3. dwShareMode(共享模式) 5. dwCreationDisposition(创建策略)…...

蓝桥杯好数
样例输入: 24 输出:7 输入:2024 输出: 150 思路:本题朴素方法的时间复杂度是O(n * log10(n)) ,不超时。主要考察能否逐位取数,注意细节pi,这样不会改变i,否则会导致循环错误。 #in…...
SOME/IP--协议英文原文讲解10
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.2.2 Req…...

欢乐力扣:赎金信
文章目录 1、题目描述2、 代码 1、题目描述 赎金信,给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在…...
【量化科普】Standard Deviation,标准差
【量化科普】Standard Deviation,标准差 🚀🚀🚀量化软件开通🚀🚀🚀 🚀🚀🚀量化实战教程🚀🚀🚀 在量化投资领域…...

stm32单片机个人学习笔记15(I2C通信协议)
前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…...
网络安全防护
一:物理安全防护 直接的物理破坏所造成的损失远大于通过网络远程攻击 提高物理安全需关注的问题: 1: 服务器和安全设备是否放置在上锁的机房内? 2: 网络设备是否被保护和监控? 3: 是否有无关人员单独在敏感区域工作&…...
YOLOV7的复现过程
复现 YOLOv7 代码的步骤相对清晰,主要分为以下几个部分: 环境准备克隆 YOLOv7 仓库准备数据集训练模型验证和测试推理(Inference) 下面是一个简化的流程来帮助你复现 YOLOv7 代码: 1. 环境准备 首先,你…...

uniapp实现app的pdf预览
实现效果 文件准备 static下添加该pdf文件(下载地址:https://gitee.com/shallow-winds/resource_package/tree/master/%E6%96%B9%E6%B3%95%E4%B8%80/html) 使用web-view进行展示: 在这里插入代码片 <web-view :src"u…...
用Java创建一个验证码的工具类
在Java中创建一个验证码工具类,可以通过以下代码实现。该工具类支持生成包含字母和数字的随机验证码图片,并添加干扰线和噪点以提高安全性。以下是详细实现: 完整代码实现 import javax.imageio.ImageIO; import java.awt.*; import java.aw…...
uvm中的激励是如何发送出去的
在UVM中,Sequence生成的激励(Transaction)通过以下协作流程发送到Driver并最终驱动到DUT,其核心机制如下: --------------- --------------- ------------ ----- | Sequence | → | Seque…...
一只企鹅如何改变世界
一、历史的转折点:一只企鹅如何改变世界 1991年,芬兰大学生Linus Torvalds在邮件列表中写道:“我正在做一个自由的操作系统(只是爱好,不会像GNU那样庞大专业)”。这个后来被称为Linux内核的项目,与GNU项目的结合,点燃了开源运动的燎原之火。 关键演化: 1996年:Tux企…...

拦截器VS过滤器:Spring Boot中请求处理的艺术!
目录 一、拦截器(Interceptor)和过滤器(Filter):都是“守门员”!二、如何实现拦截器和过滤器?三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 🌟如果喜欢作者的讲…...
C语言预处理学习笔记
1. 预处理器的功能 预处理器(Preprocessor)在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头,主要包括文件包含、宏定义、条件编译等功能。 2. 文件包含 文件包含功能用于在一个文件中包含另一个文件的内容,通常用…...
LLM基础环境准备-云服务器
软件环境 腾讯云 操作系统: TencentOS Server 3.1 (TK4) Python: 3.9.0(使用 conda的虚拟python环境,可根据实际需要更换版本,当前使用的是3.9.0的版本) CUDA Version: 12.2(腾讯云会自动安装) Driver Version: 5…...
网络协议相关知识有哪些?
前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…...

基于Llama 3.2-Vision的医学报告生成
记录运用大模型解决医学报告实例,仅介绍本地调用的情况。 前情提要 已安装 Python 显存不少于8G(8G设备上测试成功,其他环境可以自行测试)。 需要安装Ollama (Ollama 是一个允许在本地运行多模态模型的平台)。 方式1࿱…...
离线部署大模型:ollama+deepseek+open-webui
ollama 是一个开源的本地大语言模型运行框架,它提供了非常简单便捷的使用形式,让用户可以十分方便的在本地机器上部署和运行大型语言模型,从而实现免费离线的方式使用 LLM 能力,并确保私有数据的隐私和安全性。 1 ollama 安装 o…...
如何看nginx.conf文件?
是的,你的理解是对的!在 Nginx 配置中,最内层的 location 确实是决定请求最终处理的“入口”。当请求进入 Nginx 时,Nginx 会根据请求的路径(即 URL)匹配 location 块,然后按照匹配的顺序逐层向…...

3月营销日历:开启春日盛宴,绽放生活魅力
关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰:如轻薄外套、春装等,适合惊蛰后的市场需求; 美妆护肤:妇女节期间…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...