当前位置:首页 科普知识 ReadFile

ReadFile

发布时间:2023-09-05 10:08:36

从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,

ReadFile详细介绍

从文件指针指向的位置开始将数据读出到一个文件中, 且支持同步和异步操作,

ReadFile

ReadFile函数原型

BOOL ReadFile(    HANDLE hFile,            //文件的句柄    LPVOID lpBuffer,          //用于保存读入数据的一个缓冲区    DWORD nNumberOfBytesToRead,    //要读入的字节数    LPDWORD lpNumberOfBytesRead,    //指向实际读取字节数的指针    LPOVERLAPPED lpOverlapped    //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。    //该结构定义了一次异步读取操作。否则,应将这个参数设为NULL);

FILE_FLAG_OVERLAPPED

文件或设备被打开或创建异步I / O。

当后续的I / O操作完成这个句柄,OVERLAPPED结构中指定的事件 将被设置为有信号状态。

如果这个标志被指定,该文件可用于同时读取和写入操作。

如果没有指定这个标志,然后被序列化I / O操作,即使调用读写函数指定一个OVERLAPPED结构。

ReadFile功能说明

如果文件打开方式没有指明FILE_FLAG_OVERLAPPED的话,当程序调用成功时,它将实际读出文件的字节数保存到lpNumberOfBytesRead指明的地址空间中。

FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作

ReadFile

如果文件要交互使用的话,当函数调用完毕时要记得调整文件指针。

从文件中读出数据。与fread函数相比,这个函数要明显灵活的多。该函数能够操作通信设备、管道、套接字以及邮槽。

ReadFile参数说明

HANDLE hFile, 需要读入数据的文件指针,这个指针指向的文件必须是GENERIC_READ 访问属性的文件。

LPVOID lpBuffer,接收数据的缓冲区。

DWORD nNumberOfBytesToRead,指定要读取的字节数。

LPDWORD lpNumberOfBytesRead,指向一个DWORD类型变量的指针,用来接收读取的字节数。如果下一个参数为NULL,那么一定要传入这个参数。

LPOVERLAPPED lpOverlapped OVERLAPPED结构体指针,如果文件是以FILE_FLAG_OVERLAPPED方式打开的话,那么这个指针就不能为NULL。

FILE_FLAG_OVERLAPPED 允许对文件进行重叠操作

ReadFile

ReadFile返回值

调用成功,返回非0

调用不成功,返回为0

会设置GetLastError。如启动的是一次异步读操作,则函数会返回零值,并将ERROR_IO_PENDING设置成GetLastError的结果。如结果不是零值,但读入的字节数小于nNumberOfBytesToRead参数指定的值,表明早已抵达了文件的结尾。

ReadFile应用实例

//  读取文件内容,针对文件不太大的情况,文件太大需要分段读取,如果发生错误,则返回错误值//  此函数为简单示例,不考虑重叠操作,重叠操作 ReadFile 需传入最后一个参数//  LPCTSTR lpPath  输入参数,需要读取文件内容的路径//  PBYTE&  pData   输出参数,返回读取的文件内容//  DWORD&  dwSize  输出参数,返回读取的文件内容大小DWORD WINAPI ReadFileContent(IN LPCTSTR lpPath, IN OUT PBYTE& pData, IN OUT DWORD& dwSize)  {    DWORD  dwErr = NO_ERROR;    HANDLE hFile = CreateFile(lpPath, FILE_GENERIC_READ,            //  打开文件,获得文件读句柄        FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,     //  共享方式打开,避免其他地方需要读写此文件        NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);    if (INVALID_HANDLE_VALUE == hFile)                              //  文件打开失败,返回错误值        return GetLastError();    dwSize = GetFileSize(hFile, NULL);                              //  取文件大小,这里的文件不能太大,否则需要分段读取文件    pData  = (PBYTE)LocalAlloc(LPTR, dwSize);                       //  申请缓冲区,下面的 ReadFile 里面会判断这里申请是否成功    if (FALSE == ReadFile(hFile, pData, dwSize, &dwSize, NULL))     //  读取文件失败,记录失败错误值        dwErr = GetLastError();    CloseHandle(hFile);                                             //  关闭文件句柄,避免句柄泄露    return dwErr;                                                   //  返回错误值,NO_ERROR 代表没有任何错误}

温馨提示:
本文【ReadFile】由作者 爱百科 转载提供。 该文观点仅代表作者本人, 自学教育网 信息发布平台,仅提供信息存储空间服务, 若存在侵权问题,请及时联系管理员或作者进行删除。
(c)2008-2025 自学教育网 All Rights Reserved 汕头市灵创科技有限公司
粤ICP备2024240640号-6