CreateFile 是 Win32 API 中最常用也最容易“被名字骗”的函数之一。
虽然名字叫 “CreateFile”(创建文件),但它不光能创建文件,还可以打开文件、设备、管道、串口、磁盘等各种对象。
🧭 一、函数原型(简化版)
c
HANDLE CreateFile(
LPCSTR lpFileName, // 文件名或设备名
DWORD dwDesiredAccess, // 访问权限
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性(一般填 NULL)
DWORD dwCreationDisposition, // 创建/打开方式
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 模板文件句柄(一般填 NULL)
);
返回值是一个 句柄(HANDLE),成功时可用于后续操作(如读写),失败时返回 INVALID_HANDLE_VALUE。
🧩 二、各参数通俗讲解 + 举例
| 参数 | 含义 | 通俗解释 | 示例 |
|---|---|---|---|
lpFileName |
文件路径 | 你要打开或创建的目标文件 | "C:\\test\\data.txt" |
dwDesiredAccess |
访问权限 | 你想干什么?读?写?读写? | GENERIC_READ(只读)<br>GENERIC_WRITE(只写)<br>`GENERIC_READ |
dwShareMode |
共享模式 | 别的程序是否能同时访问 | FILE_SHARE_READ(允许别人读)<br>0(独占访问) |
lpSecurityAttributes |
安全属性 | 一般填 NULL 就行 |
NULL |
dwCreationDisposition |
打开/创建方式 | 如果文件存在/不存在该怎么办? | CREATE_NEW(必须新建)<br>CREATE_ALWAYS(总是重建)<br>OPEN_EXISTING(只打开已有文件)<br>OPEN_ALWAYS(打开或创建)<br>TRUNCATE_EXISTING(清空已有文件) |
dwFlagsAndAttributes |
文件属性 | 普通文件?隐藏?只读?是否异步? | FILE_ATTRIBUTE_NORMAL(普通文件)<br>FILE_FLAG_OVERLAPPED(异步 I/O) |
hTemplateFile |
模板文件 | 复制已有文件的属性 | 一般 NULL |
🧠 三、几个常见的使用例子
✅ 1️⃣ 打开一个已存在的文件进行读取
c
HANDLE hFile = CreateFile(
"C:\\data.txt", // 文件路径
GENERIC_READ, // 只读
FILE_SHARE_READ, // 允许别人同时读
NULL, // 默认安全属性
OPEN_EXISTING, // 必须文件已存在
FILE_ATTRIBUTE_NORMAL, // 普通文件
NULL // 无模板
);
👉 说明:
这就像打开一本书看内容。你只读,不写,也允许别人一起看。
✅ 2️⃣ 创建一个新的文件并写入内容
c
HANDLE hFile = CreateFile(
"C:\\log.txt", // 文件路径
GENERIC_WRITE, // 写入权限
0, // 不允许别人同时访问
NULL, // 默认安全属性
CREATE_ALWAYS, // 总是创建新文件(即使原来有也覆盖)
FILE_ATTRIBUTE_NORMAL, // 普通文件
NULL // 无模板
);
👉 说明:
这就像写日记,每次都从头开始写新的内容,原来的内容清空。
✅ 3️⃣ 打开一个串口设备(COM1)
c
HANDLE hCom = CreateFile(
"COM1", // 串口设备名
GENERIC_READ | GENERIC_WRITE, // 读写权限
0, // 独占
NULL, // 默认安全属性
OPEN_EXISTING, // 设备必须存在
0, // 无特殊属性
NULL // 无模板
);
👉 说明:CreateFile 不光能操作文件,还能打开串口、磁盘、命名管道等“文件型对象”。
✅ 4️⃣ 打开磁盘驱动器(如物理磁盘)
c
HANDLE hDisk = CreateFile(
"\\\\.\\PhysicalDrive0", // 特殊路径表示第一个物理磁盘
GENERIC_READ, // 读取权限
FILE_SHARE_READ | FILE_SHARE_WRITE, // 允许共享
NULL,
OPEN_EXISTING,
0,
NULL
);
👉 说明:
这让程序能直接读写磁盘的原始数据(低层操作)。
🧩 四、返回值和错误处理
- 成功:返回一个有效句柄(非
INVALID_HANDLE_VALUE) - 失败:返回
INVALID_HANDLE_VALUEcif (hFile == INVALID_HANDLE_VALUE) { printf("打开文件失败,错误码: %d\n", GetLastError()); }
常见错误:
| 错误码 | 含义 |
|---|---|
ERROR_FILE_NOT_FOUND |
文件不存在 |
ERROR_ACCESS_DENIED |
权限不足 |
ERROR_SHARING_VIOLATION |
文件被占用(共享模式冲突) |
🧾 五、总结(口语化记忆法)
| 参数 | 一句话记忆 |
|---|---|
lpFileName |
我要操作谁? |
dwDesiredAccess |
我要干什么?(读/写) |
dwShareMode |
允许别人同时干吗? |
lpSecurityAttributes |
安全设置(几乎总填NULL) |
dwCreationDisposition |
文件存在/不存在怎么办? |
dwFlagsAndAttributes |
这个文件有啥特殊属性? |
hTemplateFile |
要不要复制别的文件属性? |