Windows API 文件处理

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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(119) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部