CreateFile

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_VALUE
    c
    if (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 要不要复制别的文件属性?
此条目发表在安全分析分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注