CreateFile函数是Windows API中最常用的一个函数,其使用广泛,可以用于创建、打开、删除、修改文件及管道、串口、打印机等对象。在Windows操作系统下,CreateFile函数非常十分重要,没有它,我们很难进行文件操作。本文将介绍如何使用CreateFile函数创建新的文件。
1. 函数说明
CreateFile函数是Windows操作系统中最重要的一个函数之一,它可以用于创建或打开文件,也可以用来打开设备和管道,其定义如下:
```
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件名
DWORD dwDesiredAccess, // 访问模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全描述
DWORD dwCreationDisposition, // 创建模式
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 模板句柄
);
```
2. 参数详解
2.1 lpFileName
该参数是一个字符串指针,指向文件名或为文件路径(包含文件名)的指针。可以使用绝对或相对路径名。如果指定的文件名或路径名不带有反斜杠,则系统从当前目录下查找。
2.2 dwDesiredAccess
该参数指定文件的访问权限,可以是下面几种类型:
- FILE_READ_DATA:表示申请文件读取权限。
- FILE_WRITE_DATA:表示申请文件写入权限。
- FILE_APPEND_DATA:表示申请在文件末尾添加数据的权限。
- FILE_EXECUTE:表示申请执行访问权限。
- FILE_DELETE_CHILD:表示申请删除子目录和文件的权限。
- FILE_READ_ATTRIBUTES:表示申请读取文件属性的权限。
- FILE_WRITE_ATTRIBUTES:表示申请修改文件属性的权限。
参数也可以使用以下几种组合:
- GENERIC_READ:表示读取文件的权限,相当于 FILE_READ_DATA | FILE_READ_ATTRIBUTES | FILE_EXECUTE。
- GENERIC_WRITE:表示写入文件的权限,相当于FILE_WRITE_DATA | FILE_WRITE_ATTRIBUTES | FILE_APPEND_DATA。
- GENERIC_EXECUTE:表示执行的权限,相当于FILE_EXECUTE | FILE_READ_ATTRIBUTES。
- GENERIC_ALL:表示所有的权限,相当于GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | FILE_DELETE_CHILD。
在使用时,只需要传入所需要的权限即可。
2.3 dwShareMode
该参数指定了打开文件的共享模式,可以是下面几种类型:
- FILE_SHARE_WRITE:表示打开文件时不会允许写操作,但是允许共享其他的读取操作。
- FILE_SHARE_READ:表示打开文件时不会允许读取操作,但是允许共享其他的写入操作。
- FILE_SHARE_DELETE:表示打开文件时不会允许删除操作,但是允许共享其他的读取或写入操作。
- 0或FALSE:表示不允许其他进程也打开此文件。
当多个进程访问同一个文件时,可以使用此参数避免文件冲突。
2.4 lpSecurityAttributes
该参数是一个指向SECURITY_ATTRIBUTES结构体的指针,其目的是设置文件的安全描述符。如果传递NULL,则文件不具有安全描述符,并且不能与其他文件共享。
2.5 dwCreationDisposition
该参数指定如何创建或打开文件,可以是下面几种类型:
- CREATE_NEW:表示创建一个新的文件,如果文件已经存在,则函数将返回失败。
- CREATE_ALWAYS:表示如果文件存在,函数会先将其截断为零长度,然后重新打开此文件并写入数据。
- OPEN_EXISTING:表示打开一个已经存在的文件,如果文件不存在,则函数将返回失败。
- OPEN_ALWAYS:表示打开一个已经存在的文件,如果文件不存在,则新建一个文件。
- TRUNCATE_EXISTING:表示打开一个已经存在的文件,但是在打开文件时将文件的长度截成为零。
参数中CREATE_NEW、OPEN_EXISTING 和 TRUNCATE_EXISTING三种模式只能选择其中一种。
2.6 dwFlagsAndAttributes
该参数用于设置文件的属性,可以是下面几种类型:
- FILE_ATTRIBUTE_ARCHIVE:表示文件的档案属性,如果传递0,则默认为此属性。
- FILE_ATTRIBUTE_HIDDEN:表示文件的隐藏属性。
- FILE_ATTRIBUTE_NORMAL:表示文件的一般属性。
- FILE_ATTRIBUTE_READONLY:表示文件的只读属性。
- FILE_ATTRIBUTE_TEMPORARY:表示文件的临时属性。
在多数场景中,只需要传进去FILE_ATTRIBUTE_NORMAL即可。
2.7 hTemplateFile
该参数一般设置成NULL,此参数用于指定一个文件句柄,在打开时,是按照该文件的属性打开的。
3. 创建新文件
3.1 创建一个新文件
在创建新文件时,需要先确定好要创建的文件名和文件路径,如果文件路径不存在,则需要先创建文件夹。然后使用CreateFile函数来创建新文件。
示例代码:
```
#include
int main() {
HANDLE hFile = CreateFile(
TEXT("C:\\test.txt"), // 指定要创建的文件名
GENERIC_READ | GENERIC_WRITE, // 指定操作权限
0, // 共享模式
NULL, // 安全描述符
CREATE_NEW, // 创建新文件
FILE_ATTRIBUTE_NORMAL, // 文件属性
NULL); // 模板文件句柄
if (hFile == INVALID_HANDLE_VALUE) {
printf("创建文件失败!错误码:%d \n", GetLastError());
return 1;
}
printf("创建文件成功!\n");
CloseHandle(hFile);
return 0;
}
```
上面的代码创建了一个名为test.txt的文件,使用了GENERIC_READ | GENERIC_WRITE的访问权限和CREATE_NEW的创建模式。如果文件已经存在则会创建失败,如果创建成功则输出"创建文件成功!"。
3.2 打开一个已经存在的文件
在打开一个已经存在的文件时,同样需要确定好文件名和路径,这里的路径可以是绝对路径或相对路径,然后使用CreateFile函数来打开已经存在的文件。
示例代码:
```
#include
int main() {
HANDLE hFile = CreateFile(
TEXT("test.txt"), // 指定要打开的文件名
GENERIC_READ | GENERIC_WRITE, // 指定操作权限
0, // 共享模式
NULL, // 安全描述符
OPEN_EXISTING, // 打开一个已经存在的文件
FILE_ATTRIBUTE_NORMAL, // 文件属性
NULL); // 模板文件句柄
if (hFile == INVALID_HANDLE_VALUE) {
printf("打开文件失败!错误码:%d \n", GetLastError());
return 1;
}
printf("打开文件成功!\n");
CloseHandle(hFile);
return 0;
}
```
上面的代码打开了一个名为test.txt的文件,使用了GENERIC_READ | GENERIC_WRITE的访问权限和OPEN_EXISTING的打开模式。如果文件不存在则打开失败,如果打开成功则输出"打开文件成功!"。
4. 总结
CreateFile函数在Windows操作系统下非常重要,可以用于创建新文件,打开已经存在的文件,也能用于打开设备和管道。在使用CreateFile函数时,需要正确传递参数,指定好访问权限、共享模式、打开模式、文件路径以及属性等。这样才能保证CreateFile函数的正确使用。
到此,关于如何使用CreateFile函数创建新的文件,介绍完毕。希望本文能够对您有所帮助。