win32 异步读文件 例程

vs2010 建立一个控制台工程

代码如下:

// ReadFileHH.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <stdio.h>


#define   FILE_NAME    TEXT("126.txt")


int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE hEvent;
    HANDLE hFile;
    DWORD dwReturnValue;

    char inBuffer[128];

    DWORD nBytesToRead      = 20;
    DWORD dwBytesRead       = 0;
    DWORD dwFileSize        ;
    OVERLAPPED stOverlapped = {0};


    DWORD dwError  = 0;
    LPCTSTR errMsg = NULL;

    BOOL bResult   = FALSE;
    BOOL bContinue = TRUE;

    int readed;

    memset(inBuffer,0,sizeof(inBuffer));

    hFile = CreateFile(FILE_NAME,                // file to open
                       GENERIC_READ,           // open for reading
                       FILE_SHARE_READ,        // share for reading
                       NULL,                   // default security
                       OPEN_EXISTING,          // existing file only
                       FILE_FLAG_OVERLAPPED,   // overlapped operation
                       NULL);                  // no attr. template

    if (hFile == INVALID_HANDLE_VALUE) 
    { 
        DWORD dwError = GetLastError();

        printf("Could not open file (%d): %s\n", dwError); 

        return 0; 
    }

    hEvent = CreateEvent(
                NULL,    // 安全属性
                TRUE,    // 复位方式 是否手动复位
                FALSE,   //  初始状态 是否被激活
                NULL     //  对象名称
            );

    if (hEvent == NULL) 
    { 
        DWORD dwError = GetLastError();

        printf("Could not CreateEvent: %d %s\n", dwError); 

        return 0; 
    }

    memset(&stOverlapped, 0, sizeof(stOverlapped));
    stOverlapped.hEvent = hEvent; ;//事件对象,完成请求 请求触发;
    stOverlapped.Offset = 0;



    bResult = ReadFile(hFile,
                        inBuffer,
                        nBytesToRead,
                        &dwBytesRead,
                        &stOverlapped); 

    dwError = GetLastError();


    if (!bResult){

        if (GetLastError() == ERROR_IO_PENDING){//表示正在等待;

            //等待数据来读完成;
            WaitForSingleObject(hEvent, INFINITE);
            readed = stOverlapped.InternalHigh;//读到了几个字节的数据;
            inBuffer[readed] = 0;
            printf("%s\n", inBuffer);       
        }

    }


    CloseHandle(hFile);

    CloseHandle(hEvent);

    return 0;
}

读的当前目录下的文件名字是 126.txt
该文件的内容如下:

1234567890
abcdefghij
aaaaaaaaaa
bbbbbbbbbb
cccccccccc
dddddddddd
eeeeeeeeee
ffffffffff
gggggggggg

该文件使用 notepad++ 查看,显示所有字符,截图如下:
这里写图片描述

运行结果:

1234567890
abcdefgh
请按任意键继续. . .

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/80524551