Windows API 文件处理
Windows API是Windows操作系统提供的一组API函数库,可以用于Windows程序中的文件处理。常用的文件处理函数有CreateFile、ReadFile、WriteFile和CloseHandle等。
CreateFile
CreateFile函数用于创建或打开一个文件(包括设备文件)或者创建文件的句柄。函数声明如下:
```
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件名或设备名
DWORD dwDesiredAccess, // 访问模式
DWORD dwShareMode, // 共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性
DWORD dwCreationDisposition, // 文件存在处理方式
DWORD dwFlagsAndAttributes, // 文件属性和标志
HANDLE hTemplateFile // 模板句柄
);
```
参数说明:
- lpFileName:文件名或设备名,可以是绝对路径或相对路径,也可以是UNC路径。如果创建或打开设备,lpFileName应该以“\\.\”开头。
- dwDesiredAccess:访问模式,指定打开文件的访问权限。常用的取值有以下几种:
- GENERIC_READ:读访问权限
- GENERIC_WRITE:写访问权限
- GENERIC_EXECUTE:执行访问权限
- GENERIC_ALL:所有访问权限
- dwShareMode:共享模式,指定文件的共享方式。常用的取值有以下几种:
- FILE_SHARE_READ:允许其他进程读取文件
- FILE_SHARE_WRITE:允许其他进程写入文件
- FILE_SHARE_DELETE:允许其他进程删除文件
- lpSecurityAttributes:安全属性。如果不需要,可以设为NULL。
- dwCreationDisposition:文件存在处理方式,指定如果文件已经存在时应该怎样处理。常用的取值有以下几种:
- CREATE_ALWAYS:总是创建新文件,如果文件已经存在则覆盖
- CREATE_NEW:创建新文件,如果文件已经存在则失败
- OPEN_ALWAYS:打开已有文件,如果文件不存在则创建
- OPEN_EXISTING:打开已有文件,如果文件不存在则失败
- TRUNCATE_EXISTING:截断已有文件,将文件大小截断为0
- dwFlagsAndAttributes:文件属性和标志,指定文件的各种属性和标志。常用的取值有以下几种:
- FILE_ATTRIBUTE_ARCHIVE:存档文件属性。如果文件已经存在,则不会被覆盖,文件只会被更新。
- FILE_ATTRIBUTE_HIDDEN:隐藏文件属性。指定文件为隐藏文件,一般用户无法看到。
- FILE_ATTRIBUTE_NORMAL:普通文件属性。如果没有指定,则为该参数默认值。
- FILE_ATTRIBUTE_READONLY:只读文件属性。指定文件为只读文件,一般用户无法修改。
- FILE_ATTRIBUTE_TEMPORARY:临时文件属性。指定文件为临时文件,一般系统会优先在内存中存储该文件,以提高访问速度。
- FILE_FLAG_RANDOM_ACCESS:随机访问标志。指定文件是随机访问文件,系统可以采用优化算法提高文件访问速度。
- FILE_FLAG_SEQUENTIAL_SCAN:顺序扫描标志。指定文件是顺序扫描文件,系统可以采用优化算法提高文件访问速度。
- FILE_FLAG_WRITE_THROUGH:立即写入标志。指定写入文件时立即将数据写入磁盘,而不是先写入缓存。
- FILE_FLAG_OVERLAPPED:异步访问标志。指定以异步方式访问文件。
- FILE_FLAG_DELETE_ON_CLOSE:关闭时删除标志。指定文件在关闭时将被删除。
- hTemplateFile:模板句柄。如果是打开设备文件,则该参数为必须,否则可以设为NULL。
函数返回值为文件句柄。如果函数执行失败,则返回INVALID_HANDLE_VALUE。
下面是一个实例:
```
HANDLE hFile = CreateFile(
"C:\\test.txt",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
// 函数执行失败
}
```
ReadFile
ReadFile函数用于从文件中读取数据。函数声明如下:
```
BOOL ReadFile(
HANDLE hFile, // 文件句柄
LPVOID lpBuffer, // 存储读取数据的缓冲区
DWORD nNumberOfBytesToRead, // 要读取的字节数
LPDWORD lpNumberOfBytesRead, // 实际读取的字节数
LPOVERLAPPED lpOverlapped // 指定以异步方式访问文件
);
```
参数说明:
- hFile:文件句柄。
- lpBuffer:存储读取数据的缓冲区。
- nNumberOfBytesToRead:要读取的字节数。
- lpNumberOfBytesRead:实际读取的字节数。
- lpOverlapped:指定以异步方式访问文件。如果以同步方式访问文件,则该参数设为NULL。
函数返回值为读取操作是否成功。如果读取成功,则返回TRUE;否则返回FALSE。
下面是一个实例:
```
char buffer[1024]; // 读取数据的缓冲区
DWORD dwBytesRead = 0; // 实际读取的字节数
if (!ReadFile(hFile, buffer, 1024, &dwBytesRead, NULL)) {
// 函数执行失败
}
```
WriteFile
WriteFile函数用于向文件中写入数据。函数声明如下:
```
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 要写入的数据缓冲区
DWORD nNumberOfBytesToWrite, // 要写入的字节数
LPDWORD lpNumberOfBytesWritten, // 实际写入的字节数
LPOVERLAPPED lpOverlapped // 指定以异步方式访问文件
);
```
参数说明:
- hFile:文件句柄。
- lpBuffer:要写入的数据缓冲区。
- nNumberOfBytesToWrite:要写入的字节数。
- lpNumberOfBytesWritten:实际写入的字节数。
- lpOverlapped:指定以异步方式访问文件。如果以同步方式访问文件,则该参数设为NULL。
函数返回值为写入操作是否成功。如果写入成功,则返回TRUE;否则返回FALSE。
下面是一个实例:
```
char buffer[] = "Hello, World!"; // 要写入的数据
DWORD dwBytesWritten = 0; // 实际写入的字节数
if (!WriteFile(hFile, buffer, strlen(buffer), &dwBytesWritten, NULL)) {
// 函数执行失败
}
```
CloseHandle
CloseHandle函数用于关闭文件句柄。函数声明如下:
```
BOOL CloseHandle(
HANDLE hObject // 文件句柄
);
```
参数说明:
- hObject:文件句柄。
函数返回值为文件句柄是否成功关闭。如果关闭成功,则返回TRUE;否则返回FALSE。
下面是一个实例:
```
if (!CloseHandle(hFile)) {
// 函数执行失败
}
```
总结
以上是一些常用的Windows API文件处理函数的介绍。通过使用这些函数,我们可以在Windows程序中方便地处理文件和设备。下面是一个完整的实例,演示如何打开、读取、写入和关闭一个文件:
```
#include #include int main() { // 打开文件 HANDLE hFile = CreateFile( "C:\\test.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile == INVALID_HANDLE_VALUE) { printf("CreateFile failed (%d)\n", GetLastError()); return 1; } printf("File opened successfully\n"); // 读取数据 char buffer[1024]; DWORD dwBytesRead = 0; if (!ReadFile(hFile, buffer, 1024, &dwBytesRead, NULL)) { printf("ReadFile failed (%d)\n", GetLastError()); return 1; } printf("Read %d bytes from file: %s\n", dwBytesRead, buffer); // 写入数据 char data[] = "Hello, World!"; DWORD dwBytesWritten = 0; if (!WriteFile(hFile, data, strlen(data), &dwBytesWritten, NULL)) { printf("WriteFile failed (%d)\n", GetLastError()); return 1; } printf("Wrote %d bytes to file: %s\n", dwBytesWritten, data); // 关闭文件 if (!CloseHandle(hFile)) { printf("CloseHandle failed (%d)\n", GetLastError()); return 1; } printf("File closed successfully\n"); return 0; } ``` 壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。 我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复