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

【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官方文档)


http://www.kler.cn/a/554272.html

相关文章:

  • 【SpringBoot整合系列】Kafka的各种模式及Spring Boot整合的使用基础案例
  • React 源码揭秘 | CompleteWork “归“的过程
  • jupyterhub_config配置文件内容
  • 5G-A的尔滨故事,冰雪下的科技春潮
  • MIMO系统信道容量(开环与闭环)
  • 蓝桥杯 Java B 组之区间调度、找零问题(理解贪心局限性)
  • 解锁机器学习核心算法|神经网络:AI 领域的 “超级引擎”
  • 线性代数中的向量与向量空间
  • 深入解析:短轮询、长轮询、长连接与WebSocket(原理到实现)
  • ubuntu安装docker docker/DockerHub 国内镜像源/加速列表【持续更新】
  • 2.19学习(php文件后缀)
  • C语言循环结构详解
  • java项目之风顺农场供销一体系统的设计与实现(源码+文档)
  • 如何通过指标平台,最大化地提升数据分析的效率和质量?
  • vue3的composition api 如何使用render创建组件
  • 基于ffmpeg+openGL ES实现的视频编辑工具-整体开发思路介绍(二)
  • Node.js技术原理分析系列——如何在Node.js中新增一个内置模块
  • C语言-----操作符的分类
  • 斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(下)
  • 如何将MySQL数据库迁移至阿里云