CreateFile ReadFile 实现异步读写
时间: 2024-05-16 15:14:15 浏览: 163
在 Windows 平台下,可以使用 CreateFile 和 ReadFile 函数实现异步读写。
步骤如下:
1. 使用 CreateFile 函数打开文件或设备,设置文件属性和访问模式,得到文件句柄。
2. 创建事件对象,用于在异步操作完成时通知主线程。
3. 使用 ReadFile 函数进行异步读取操作,将文件句柄、读取缓冲区、缓冲区大小、指向已读取字节数的变量(用于返回异步操作读取的字节数)和指向 OVERLAPPED 结构体的指针作为参数。OVERLAPPED 结构体中包含了用于异步操作的事件对象。
4. 主线程等待事件对象通知异步操作完成,使用 GetOverlappedResult 函数获取异步操作的结果。
以下是一个简单的示例代码:
```c++
#include <windows.h>
#include <tchar.h>
#define BUFFER_SIZE 1024
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile;
DWORD dwBytesRead;
char buffer[BUFFER_SIZE];
OVERLAPPED overlapped = {0};
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
hFile = CreateFile(_T("test.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
_tprintf(_T("Failed to open file (error %d)\n"), GetLastError());
return 1;
}
overlapped.hEvent = hEvent;
if (!ReadFile(hFile, buffer, BUFFER_SIZE, &dwBytesRead, &overlapped))
{
if (GetLastError() != ERROR_IO_PENDING)
{
_tprintf(_T("Failed to read file (error %d)\n"), GetLastError());
return 1;
}
}
_tprintf(_T("Waiting for read to complete...\n"));
if (WaitForSingleObject(hEvent, INFINITE) != WAIT_OBJECT_0)
{
_tprintf(_T("Failed to wait for event (error %d)\n"), GetLastError());
return 1;
}
if (!GetOverlappedResult(hFile, &overlapped, &dwBytesRead, FALSE))
{
_tprintf(_T("Failed to get overlapped result (error %d)\n"), GetLastError());
return 1;
}
_tprintf(_T("Read %d bytes: %s\n"), dwBytesRead, buffer);
CloseHandle(hFile);
CloseHandle(hEvent);
return 0;
}
```
在该示例中,CreateFile 函数打开名为 test.txt 的文件,并将文件句柄存储在 hFile 变量中。然后,创建事件对象并将其存储在 hEvent 变量中。接着,使用 ReadFile 函数进行异步读取操作,并将 OVERLAPPED 结构体中的事件对象设置为 hEvent。主线程等待事件对象通知异步操作完成,然后使用 GetOverlappedResult 函数获取异步操作的结果。最后,关闭文件句柄和事件对象,并返回 0。
阅读全文