CreateFile函数是Windows系统API函数之一,用于创建或打开文件或设备。它的使用非常灵活和广泛,是文件操作和磁盘 IO 的基础。对于开发 Windows 程序的程序员而言,熟练掌握CreateFile函数的使用是非常重要的。在本文中,我们将重点介绍如何使用CreateFile函数快速创建文件。
一、CreateFile函数的基本介绍
在使用CreateFile函数的时候,我们通常需要按照一定的方式调用它,下面是CreateFile函数的定义:
```cpp
HANDLE CreateFile(
LPCTSTR lpFileName, //文件名
DWORD dwDesiredAccess, //访问控制标志
DWORD dwShareMode, //共享模式标志
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全属性指针
DWORD dwCreationDisposition, //文件创建或覆盖标志
DWORD dwFlagsAndAttributes, //文件标志和属性标志
HANDLE hTemplateFile //模板句柄
);
```
我们可以通过这些参数去自定义文件的方式创建和操作。
二、使用CreateFile创建文件和打开文件
1.创建文件
首先,我们会用到CreateFile函数中的第一个参数lpFileName,它是要创建的文件的完整路径名。我们可以使用如下代码创建一个文件:
```cpp
HANDLE hFile = CreateFile(
TEXT("c:\\mytestfile.txt"),
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
```
我们在这里创建了一个名为“mytestfile”的文本文件,并将其路径指定为“c:\\mytestfile.txt”。
其中,第一个参数定义了文件的名称和路径。第二个参数标志着我们希望以什么方式来操作这个文件。在这个例子中,我们想要写入文件,因此我们选择了写入访问权限。第三个参数是文件共享模式,我们这里选择了0,表示该文件不能被共享。第四个参数是安全属性。第五个参数是创建标志,这里我们选择了CREATE_ALWAYS,表示如果文件不存在,则创建文件。如果文件已存在,则会先把文件清空然后再写入数据。第六个参数是文件属性标识,这里我们选用 FILE_ATTRIBUTE_NORMAL,表示默认的文件属性。最后一个参数是模板句柄,这个参数不太常用,所以我们可以把它设置为NULL即可。
这样我们就快速创建了一个文件。如果想要在新创建的文件中写一些内容,可以使用WriteFile函数,代码如下:
```cpp
LPCTSTR data = TEXT("Hello world\n");
DWORD dwBytesWritten = 0;
WriteFile(hFile, data, sizeof(data), &dwBytesWritten, NULL);
```
这里我们将“Hello world”文本写入了文件。
2.打开文件
除了创建文件,我们还可以使用CreateFile函数来打开现有的文件。下面的代码展示了如何以只读方式打开文件:
```cpp
HANDLE hFile = CreateFile(
TEXT("c:\\mytestfile.txt"),
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
```
在这个例子中,我们通过定义第一个参数来指示要打开的文件。第二个参数代表我们想要以读取访问权限打开文件,而不是写入它。第三个参数允许多个进程在同一时间使用文件。第四个参数是安全属性。第五个参数定义了我们想要打开文件的方式,这里我们选择使用OPEN_EXISTING,表示文件已存在,我们现在进行打开。下面的参数是文件属性标识。最后一个参数仍然是模板句柄,这里我们将它设置为NULL。
三、使用CreateFile读写文件
1.使用ReadFile函数读取文件
如果我们已经成功打开了一个文件,那么我们就可以使用ReadFile函数从该文件读取数据。下面的代码展示了如何读取文件中的数据:
```cpp
DWORD dwFileSize = GetFileSize(hFile, NULL);
char *buffer = new char[dwFileSize + 1];
dwBytesRead = 0;
ReadFile(hFile, buffer, dwFileSize, &dwBytesRead, NULL);
buffer[dwFileSize] = '\0';
```
这个例子中,我们首先调用了GetFileSize函数,获得整个文件的大小。接着,我们使用new运算符为缓冲区分配内存。第二个参数指定缓冲区大小,该大小应该是文件大小加1。接下来,我们调用ReadFile函数读取文件内容。该函数的第一个参数是文件句柄,第二个参数是指向存储数据的缓冲区。第三个参数是缓冲区大小。第四和第五个参数分别是指向已读取的字节数和文件指针的指针。最后我们将读取到的文本以NULL结尾并显示出来。
2.使用WriteFile函数写入文件
除了从文件中读取数据,我们也可以使用WriteFile函数写数据到文件中。下面的代码展示了如何将一段字符串写入到文件中。
```cpp
DWORD dwBytesWritten = 0;
char* data = "Hello World!";
WriteFile(hFile, data, strlen(data), &dwBytesWritten, NULL);
```
这个例子中,我们定义一个字符串并将其存储在变量“data”中。我们的目标是将它写入到我们打开过的文本文件中。我们首先调用WriteFile函数,第一个参数是文件句柄,第二个参数是指向要写入数据的缓冲区。第三个参数是要写入的数据量,我们使用strlen函数来计算字符串的长度。第四个参数是指向已写入的字节数和文件指针的指针。最后一个参数再次是模板句柄,设置为NULL。
四、关闭文件和清理内存
在使用CreateFile和类似的函数时,我们也需要将文件句柄释放掉。在不需要访问该文件句柄时,我们应该调用CloseHandle函数,以便将其释放。代码如下所示:
```cpp
CloseHandle(hFile);
```
此外,在ReadFile和WriteFile函数的调用结束后,我们也应该通过delete运算符或delete[]运算符手动清理内存,以免发生内存泄漏。
五、总结
总的来说,CreateFile函数是Windows系统API函数之一,它非常灵活和广泛地用于文件操作,包括创建、打开、关闭、读取和写入文件等操作。在使用CreateFile函数时,我们需要按照其定义的参数来自定义我们想要进行的操作。本文详细说明了如何使用CreateFile函数快速创建和读写文件。希望这篇文章能够对您有所帮助,感谢您的阅读。