当前位置: 首页 > news >正文

【C语言】CreateFile函数用法介绍

目录

一、函数原型与基本功能

二、参数详解

1. lpFileName(文件路径)

2. dwDesiredAccess(访问权限)

补充说明

3. dwShareMode(共享模式)

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仅允许查询元数据(如属性、大小),不进行实际读写操作获取文件信息(GetFileSizeGetFileTime)时无需读写权限单独使用
GENERIC_READ允许读取文件或设备数据,支持移动文件指针读取文件内容(ReadFile)、查看日志、复制文件GENERIC_READ | GENERIC_WRITE(读写权限组合)
GENERIC_WRITE允许写入数据,支持移动文件指针或调整文件大小写入文件(WriteFile)、修改设备配置(如串口通信)GENERIC_READ | GENERIC_WRITE(常见组合)、GENERIC_WRITE | GENERIC_ALL
GENERIC_EXECUTE保留值,通常用于可执行文件或驱动程序的执行权限(需设备支持)注册表操作、可执行文件加载(实际文件操作中较少使用)通常单独使用,需参考具体设备文档
GENERIC_ALL授予完全控制权限(读、写、执行、删除),需配合安全描述符使用管理员操作(修改系统文件、磁盘格式化)单独使用或与 0 组合(查询元数据 + 完全控制)

补充说明

  1. 权限冲突:若请求的访问权限与 dwShareMode 参数指定的共享模式冲突,函数将返回 ERROR_SHARING_VIOLATION
  2. 设备兼容性:如串口设备通常需同时指定 GENERIC_READ \| GENERIC_WRITE 以支持双向通信。
  3. 特殊权限要求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(模板文件句柄)

  • 作用:复制已有文件的扩展属性(如创建时间、压缩标志)
  • 限制:仅当dwCreationDispositionCREATE_NEWOPEN_ALWAYS时生效8

三、返回值与错误处理

  1. 成功时:返回有效的句柄(需用CloseHandle()关闭)
  2. 失败时:返回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
);

五、扩展注意事项

  1. 句柄泄漏:必须通过CloseHandle()释放资源,否则导致系统资源耗尽
  2. 路径规范化:建议使用\\?\前缀绕过MAX_PATH限制(仅Unicode版本)
  3. 事务操作:需使用CreateFileTransacted()实现原子文件操作3
  4. 设备兼容性:部分标志(如FILE_FLAG_NO_BUFFERING)对物理磁盘有特殊要求

(完整参数列表及系统级限制可参考Microsoft官方文档)

相关文章:

【C语言】CreateFile函数用法介绍

目录 一、函数原型与基本功能 二、参数详解 1. lpFileName(文件路径) 2. dwDesiredAccess(访问权限) 补充说明 3. dwShareMode(共享模式) 5. dwCreationDisposition(创建策略&#xff09…...

蓝桥杯好数

样例输入: 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,标准差 🚀🚀🚀量化软件开通🚀🚀🚀 🚀🚀🚀量化实战教程🚀🚀🚀 在量化投资领域&#xf…...

stm32单片机个人学习笔记15(I2C通信协议)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…...

网络安全防护

一:物理安全防护 直接的物理破坏所造成的损失远大于通过网络远程攻击 提高物理安全需关注的问题: 1: 服务器和安全设备是否放置在上锁的机房内? 2: 网络设备是否被保护和监控? 3: 是否有无关人员单独在敏感区域工作&…...

YOLOV7的复现过程

复现 YOLOv7 代码的步骤相对清晰,主要分为以下几个部分: 环境准备克隆 YOLOv7 仓库准备数据集训练模型验证和测试推理(Inference) 下面是一个简化的流程来帮助你复现 YOLOv7 代码: 1. 环境准备 首先,你…...

uniapp实现app的pdf预览

实现效果 文件准备 static下添加该pdf文件&#xff08;下载地址&#xff1a;https://gitee.com/shallow-winds/resource_package/tree/master/%E6%96%B9%E6%B3%95%E4%B8%80/html&#xff09; 使用web-view进行展示&#xff1a; 在这里插入代码片 <web-view :src"u…...

用Java创建一个验证码的工具类

在Java中创建一个验证码工具类&#xff0c;可以通过以下代码实现。该工具类支持生成包含字母和数字的随机验证码图片&#xff0c;并添加干扰线和噪点以提高安全性。以下是详细实现&#xff1a; 完整代码实现 import javax.imageio.ImageIO; import java.awt.*; import java.aw…...

uvm中的激励是如何发送出去的

在UVM中&#xff0c;Sequence生成的激励&#xff08;Transaction&#xff09;通过以下协作流程发送到Driver并最终驱动到DUT&#xff0c;其核心机制如下&#xff1a; --------------- --------------- ------------ ----- | Sequence | → | Seque…...

一只企鹅如何改变世界

一、历史的转折点:一只企鹅如何改变世界 1991年,芬兰大学生Linus Torvalds在邮件列表中写道:“我正在做一个自由的操作系统(只是爱好,不会像GNU那样庞大专业)”。这个后来被称为Linux内核的项目,与GNU项目的结合,点燃了开源运动的燎原之火。 关键演化: 1996年:Tux企…...

拦截器VS过滤器:Spring Boot中请求处理的艺术!

目录 一、拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;&#xff1a;都是“守门员”&#xff01;二、如何实现拦截器和过滤器&#xff1f;三、拦截器和过滤器的区别四、执行顺序五、真实的应用场景六、总结 &#x1f31f;如果喜欢作者的讲…...

C语言预处理学习笔记

1. 预处理器的功能 预处理器&#xff08;Preprocessor&#xff09;在编译C语言程序之前对源代码进行预处理。预处理指令以#号开头&#xff0c;主要包括文件包含、宏定义、条件编译等功能。 2. 文件包含 文件包含功能用于在一个文件中包含另一个文件的内容&#xff0c;通常用…...

LLM基础环境准备-云服务器

软件环境 腾讯云 操作系统&#xff1a; TencentOS Server 3.1 (TK4) Python: 3.9.0(使用 conda的虚拟python环境&#xff0c;可根据实际需要更换版本&#xff0c;当前使用的是3.9.0的版本) CUDA Version: 12.2&#xff08;腾讯云会自动安装&#xff09; Driver Version: 5…...

网络协议相关知识有哪些?

前言 网络协议的基础是OSI和TCP/IP模型,这两个模型是理解协议分层的关键。 正文(仅是个人理解,如有遗漏望海涵) 网络协议是网络中设备间通信的规则和标准,涉及数据传输、路由、错误控制等多个方面。以下是网络协议相关知识的系统梳理: 一、网络协议分层模型 1、OSI七…...

基于Llama 3.2-Vision的医学报告生成

记录运用大模型解决医学报告实例&#xff0c;仅介绍本地调用的情况。 前情提要 已安装 Python 显存不少于8G&#xff08;8G设备上测试成功&#xff0c;其他环境可以自行测试&#xff09;。 需要安装Ollama (Ollama 是一个允许在本地运行多模态模型的平台)。 方式1&#xff1…...

离线部署大模型:ollama+deepseek+open-webui

ollama 是一个开源的本地大语言模型运行框架&#xff0c;它提供了非常简单便捷的使用形式&#xff0c;让用户可以十分方便的在本地机器上部署和运行大型语言模型&#xff0c;从而实现免费离线的方式使用 LLM 能力&#xff0c;并确保私有数据的隐私和安全性。 1 ollama 安装 o…...

如何看nginx.conf文件?

是的&#xff0c;你的理解是对的&#xff01;在 Nginx 配置中&#xff0c;最内层的 location 确实是决定请求最终处理的“入口”。当请求进入 Nginx 时&#xff0c;Nginx 会根据请求的路径&#xff08;即 URL&#xff09;匹配 location 块&#xff0c;然后按照匹配的顺序逐层向…...

3月营销日历:开启春日盛宴,绽放生活魅力

关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰&#xff1a;如轻薄外套、春装等&#xff0c;适合惊蛰后的市场需求&#xff1b; 美妆护肤&#xff1a;妇女节期间&#xf…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关

在水泥厂的生产流程中&#xff0c;工业自动化网关起着至关重要的作用&#xff0c;尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关&#xff0c;为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多&#xff0c;其中不少设备采用Devicenet协议。Devicen…...