一、文件的创建
CreateFile 是一个 Windows API 函数,用于创建或打开文件、设备、目录或管道。它是 Windows 操作系统中文件和 I/O 操作的基础之一。CreateFile 允许你指定文件的访问方式、共享模式、创建选项等,并返回一个文件句柄,通过该句柄可以执行读取、写入、关闭等操作。
以下是 CreateFile 函数的基本签名:
HANDLE CreateFile( LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile );
下面是各个参数的介绍:
lpFileName:要创建或打开的文件的路径或名称。dwDesiredAccess:指定对文件的访问权限,如 GENERIC_READ、GENERIC_WRITE、GENERIC_EXECUTE 等。dwShareMode:指定其他进程是否可以同时访问该文件,如 FILE_SHARE_READ、FILE_SHARE_WRITE 等。lpSecurityAttributes:指定一个SECURITY_ATTRIBUTES结构,用于指定文件的安全属性,通常为NULL。dwCreationDisposition:指定文件的创建方式,如 CREATE_NEW、CREATE_ALWAYS、OPEN_EXISTING 等。dwFlagsAndAttributes:指定文件的其他属性和标志,如 FILE_ATTRIBUTE_NORMAL、FILE_FLAG_WRITE_THROUGH 等。hTemplateFile:可选参数,通常为NULL。
示例代码:
#include <Windows.h>
#include <iostream>
int main() {
HANDLE hFile = CreateFile(TEXT("test.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, NULL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "CreateFile failed!" << GetLastError() << std::endl;
return 0;
}
std::cout << "CreateFile success!" << std::endl;
CloseHandle(hFile);
return 1;
}
INVALID_HANDLE_VALUE 是一个 Windows API 中定义的常量,用于表示无效的文件句柄(handle)。在 Windows 操作系统中,文件句柄是用于标识打开的文件、设备、管道等对象的一种标识符。INVALID_HANDLE_VALUE 表示一个无效或失败的文件句柄,通常用于指示文件打开或创建操作失败。当你调用诸如 CreateFile、OpenFile 等文件操作函数时,如果操作失败或出现错误,这些函数通常会返回 INVALID_HANDLE_VALUE 来表示操作未成功。这可以作为错误处理的一部分,你可以检查函数的返回值是否等于 INVALID_HANDLE_VALUE,如果是,则表示操作失败,然后可以使用 GetLastError 函数获取具体的错误代码,以便进行适当的错误处理。
二、文件的写入
1.WriteFile函数的介绍和使用
WriteFile 函数是 Windows API 中用于将数据写入文件或其他输出设备的函数。它通常用于将数据写入已经打开的文件句柄。
WriteFile 函数的基本签名:
BOOL WriteFile( HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped );
下面是各个参数的介绍:
hFile:要写入的文件句柄,该句柄必须是已经打开的,并且具有适当的写入权限。lpBuffer:一个指向包含要写入数据的缓冲区的指针。nNumberOfBytesToWrite:要写入的字节数。lpNumberOfBytesWritten:一个指向 DWORD 类型的指针,用于接收实际写入的字节数。可以为NULL,表示不需要这个信息。lpOverlapped:一个指向OVERLAPPED结构的指针,通常用于异步 I/O 操作,可以为NULL,表示同步操作。
2.FlushFileBuffers()函数的介绍和使用
FlushFileBuffers 函数是 Windows API 中用于刷新文件缓冲区的函数。它通常用于确保文件的写入操作已经完成,而不仅仅是将数据写入文件缓冲区。在某些情况下,文件写入操作可能会被操作系统延迟以提高性能,但 FlushFileBuffers 可以用来强制将缓冲区中的数据写入物理存储介质,例如硬盘,以确保数据不会丢失。
BOOL FlushFileBuffers( HANDLE hFile );
代码示例:
#include <Windows.h>
#include <stdio.h>
#include <iostream>
int main() {
char buffer[] = "hello world";
DWORD writeCount = 0;
HANDLE hFile = CreateFile(TEXT("test.txt"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, NULL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "CreateFile failed!" << GetLastError() << std::endl;
return 0;
}
std::cout << "CreateFile success!" << std::endl;
BOOL ret = WriteFile(hFile, buffer, strlen(buffer), &writeCount, NULL);
if (!ret) {
CloseHandle(hFile);
std::cout << "WriteFile failed!" << std::endl;
return 0;
}
std::cout << "WriteFile success!" << std::endl;
if (!FlushFileBuffers(hFile)) {
std::cout << "FlushFileBuffers failed!" << GetLastError() << std::endl;
CloseHandle(hFile);
return 0;
}
std::cout << "FlushFileBuffers success!" << std::endl;
CloseHandle(hFile);
return 1;
}
三、文件的读取
ReadFile 函数是 Windows API 中用于从文件、设备或管道中读取数据的函数。它通常用于从已打开的文件句柄中读取数据。
以下是 ReadFile 函数的基本签名:
BOOL ReadFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped );
下面是各个参数的介绍:
hFile:要读取数据的文件句柄,该句柄必须是已经打开的,并且具有适当的读取权限。lpBuffer:一个指向用于接收读取数据的缓冲区的指针。nNumberOfBytesToRead:要读取的字节数。lpNumberOfBytesRead:一个指向 DWORD 类型的指针,用于接收实际读取的字节数。可以为NULL,表示不需要这个信息。lpOverlapped:一个指向OVERLAPPED结构的指针,通常用于异步 I/O 操作,可以为NULL,表示同步操作。
示例代码:
#include <Windows.h>
#include <stdio.h>
#include <iostream>
int main() {
char buffer[255] = {0};
DWORD readCount = 0;
HANDLE hFile = CreateFile(TEXT("test.txt"), GENERIC_READ , 0, NULL, OPEN_EXISTING, NULL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "CreateFile failed!" << GetLastError() << std::endl;
return 0;
}
BOOL ret = ReadFile(hFile, buffer, 255, &readCount, NULL);
if (!ret) {
CloseHandle(hFile);
std::cout << "ReadFile failed!" << std::endl;
return 0;
}
CloseHandle(hFile);
std::cout << "read byte length:" << readCount << std::endl;
std::cout << "buffer:" << buffer << std::endl;
return 1;
}