【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.重点关注品类 春季服饰:如轻薄外套、春装等,适合惊蛰后的市场需求; 美妆护肤:妇女节期间…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
