【createfile函数详解】在Windows操作系统中,`CreateFile` 是一个非常重要的系统调用函数,广泛应用于文件操作、设备访问以及进程间通信等场景。无论是开发底层驱动程序,还是编写普通的应用程序,理解 `CreateFile` 的使用方式和工作原理都至关重要。
一、函数定义
`CreateFile` 函数的原型如下:
```c
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
```
该函数返回一个 `HANDLE` 类型的句柄,用于后续对文件或设备的操作。
二、参数解析
1. `lpFileName`
- 类型:`LPCTSTR`(指向字符串的指针)
- 作用:指定要创建或打开的文件名或设备名称。
- 示例:`"C:\\test.txt"` 或 `"\\\\.\\PhysicalDrive0"`
2. `dwDesiredAccess`
- 类型:`DWORD`
- 作用:指定对文件的访问权限,可以是读、写、执行等组合。
- 常见值:
- `GENERIC_READ`:允许读取
- `GENERIC_WRITE`:允许写入
- `GENERIC_READ | GENERIC_WRITE`:允许读写
3. `dwShareMode`
- 类型:`DWORD`
- 作用:指定文件的共享模式。
- 常见值:
- `FILE_SHARE_READ`:允许其他进程读取
- `FILE_SHARE_WRITE`:允许其他进程写入
- `FILE_SHARE_DELETE`:允许其他进程删除
4. `lpSecurityAttributes`
- 类型:`LPSECURITY_ATTRIBUTES`
- 作用:指定安全属性,通常为 `NULL` 表示使用默认安全设置。
5. `dwCreationDisposition`
- 类型:`DWORD`
- 作用:指定如何创建或打开文件。
- 常见值:
- `CREATE_NEW`:仅当文件不存在时创建
- `CREATE_ALWAYS`:总是创建新文件,覆盖已有文件
- `OPEN_EXISTING`:仅当文件存在时打开
- `OPEN_ALWAYS`:如果文件存在则打开,否则创建
- `TRUNCATE_EXISTING`:打开文件并清空内容
6. `dwFlagsAndAttributes`
- 类型:`DWORD`
- 作用:指定文件属性和标志。
- 常见值:
- `FILE_ATTRIBUTE_NORMAL`:普通文件
- `FILE_ATTRIBUTE_READONLY`:只读文件
- `FILE_ATTRIBUTE_HIDDEN`:隐藏文件
- `FILE_FLAG_OVERLAPPED`:异步 I/O 操作
7. `hTemplateFile`
- 类型:`HANDLE`
- 作用:用于复制文件属性的模板文件句柄,通常设为 `NULL`。
三、返回值
- 成功:返回有效的文件句柄(非 `INVALID_HANDLE_VALUE`)。
- 失败:返回 `INVALID_HANDLE_VALUE`,可以通过 `GetLastError()` 获取错误代码。
四、典型使用场景
1. 创建并写入文件
```c
HANDLE hFile = CreateFile("C:\\test.txt",
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile != INVALID_HANDLE_VALUE) {
// 写入数据
DWORD bytesWritten;
WriteFile(hFile, "Hello, World!", 13, &bytesWritten, NULL);
CloseHandle(hFile);
}
```
2. 打开现有文件进行读取
```c
HANDLE hFile = CreateFile("C:\\test.txt",
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile != INVALID_HANDLE_VALUE) {
char buffer[100];
DWORD bytesRead;
ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL);
CloseHandle(hFile);
}
```
五、注意事项
- 使用 `CreateFile` 后,务必通过 `CloseHandle` 关闭句柄,避免资源泄漏。
- 在多线程环境中,需合理设置 `dwShareMode` 和 `dwCreationDisposition` 参数,以防止冲突。
- 对于设备访问(如磁盘、串口等),`lpFileName` 可以是类似 `"\\\\.\\COM1"` 或 `"\\\\.\\PhysicalDrive0"` 的路径。
六、总结
`CreateFile` 是 Windows API 中最基础、最强大的文件操作函数之一。掌握其使用方法不仅有助于日常开发,还能深入理解系统级编程。通过合理配置各个参数,开发者可以实现灵活、高效的文件和设备操作。
无论你是初学者还是经验丰富的程序员,了解 `CreateFile` 的功能与细节都将为你带来极大的帮助。