`
milk_nenu
  • 浏览: 13603 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

ReadFile() WIN API

 
阅读更多

       ReadFile函数从文件指针指定的位置读取数据。读操作完成后,文件指针将根据实际读出的数据自动进行调整,除非文件句柄是以OVERLAPPED属性值打开的。如果是以OVERLAPPED打开的I/O,应用程序就需要自己手动调整文件指针。
      这个函数被设计成兼有同步和异步操作。ReadFileEx函数则设计成只支持异步操作,异步操作允许应用程序在读文件期间可以同时进行其他的操作。
    函数原型:
BOOL ReadFile(
HANDLE hFile,                // handle to file
LPVOID lpBuffer,             // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped    // overlapped buffer
);

【Parameters】
1、hFile
    文件句柄(必须具有GENERIC_READ访问权限)。
    在Windows NT/2000/XP平台上:对于异步读操作,hFile可以是由CreateFile函数以FILE_FLAG_OVERLAPPED方式打开的任何句柄,或者一个由socket或accept函数返回的socket句柄。
    在Windows 95/98/Me平台上:对于邮槽、命名管道和磁盘文件不能使用异步读操作。 
2、lpBuffer
    用来接收从文件中读出的数据的缓冲区指针。
3、nNumberOfBytesToRead
    指明要读的字节总数。
4、lpNumberOfBytesRead
      一个变量指针,用来存储实际传输的字节总数。ReadFile在做所有事情(包括错误检查)之前,先将这个值赋为0。当ReadFile从一个命名管道上返回TRUE时这个参数为0,说明消息管道另一端调用WriteFile时设置的nNumberOfBytesToWrite 参数为0。
     在Windows NT/2000/XP平台上:如果lpOverlapped 为NULL,则lpNumberOfBytesRead不能为NULL。如果lpOverlapped 不是NULL,lpNumberOfBytesRead可以设为NULL。如果是一个overlapped形式的读操作,我们可以动用GetOverlappedResult函数来获得传输的实际字节数。如果hFile关联的是一个完成端口(I/O completion port),那么可以调GetQueuedCompletionStatus函数来获得传输的实际字节数。
     如果完成端口(I/O completion port)被占用,而你用的是一个用于释放内存的回调例程,对于lpOverlapped参数指向的OVERLAPPED结构体来说,为这个参数指定NULL可以避免重新分配内存时发生内存泄漏。内存泄漏会导致返回这个参数值时是一个非法值。
      Windows 95/98/Me平台上:这个参数不允许为NULL。
5、lpOverlapped
        一个指向OVERLAPPED结构体的指针。如果hFile是以FILE_FLAG_OVERLAPPED方式获得的句柄,这个结构是必须的,不能为NULL。(否则函数会在错误的时刻报告读操作已经完成了)。这时,读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,并且在实际完成读操作之前就返回了。在这种情况下,ReadFile返回FALSE,GerLastError报告从错误类型是ERROR_IO_PENDING。这允许调用进程继续其他工作直到读操作完成。OVERLAPPED结构中的事件将会在读操作完成时被使能。
    如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped为NULL,读操作就从当前文件的开始位置读起,直到读操作完成ReadFile函数才能返回。
    在Windows NT/2000/XP平台上:如果hFile不是以FILE_FLAG_OVERLAPPED方式获得的句柄,并且lpOverlapped不为NULL,则读操作在由OVERLAPPED中Offset成员指定的偏移地址开始读,直到读操作完成ReadFile函数才能返回。
    在Windows 95/98/Me平台上:对于文件、磁盘、管道和邮槽的操作,这个参数必须为NULL。一个不为空的OVERLAPPED结构体指针将导致调用失败。Windows 95/98/Me平台只支持串行口和并行口的overlapped 读写。

【Return Values】
    有如下任一种情况发生都会导致函数返回:(1)在管道另一端的写操作完成后(2)请求的字节数传输完毕(3)发生错误。
    如果函数正确,返回非零。
    如果返回值是非零,但接收的字节数是0,那么可能是文件指针在读操作期间超出了文件的end位置。然而,如果文件以FILE_FLAG_OVERLAPPED方式打开,lpOverlapped 参数不为NULL,文件指针在读操作期间超出了文件的end位置,那么返回值肯定是FALSE,GetLastError返回的错误是ERROR_HANDLE_EOF。

【Remarks】
    如果文件的一部分被另一个进程锁定,而当前进程试图重复锁定,那将会失败。
    一个应用程序在读以FILE_FLAG_NO_BUFFERING方式打开的文件时要符合一定的条件。
(1)文件读的开始地址必须是扇区大小的整数倍。GetDiskFreeSpace函数可以取得扇区的大小。
(2)请求读的字节数也必须是扇区大小的整数倍。
(3)用于读写操作的Buffer地址必须按照扇区大小进行边界对齐。可以通过用VirtualAlloc 函数申请内存来做到。
    在读操作期间试图访问相应的输入缓冲区,会导致读入到缓冲区的数据损坏。读操作完成之前,应用程序不能对这段输入缓冲区做任何操作(包括读、写、重新分配内存,释放内存等)。
    ReadFile可以通过指向控制台输入对象的句柄将控制台的输入字符读出来。控制台的模式决定了ReadFile的具体行为。
    如果一个命名管道正在以消息模式被读取,并且下一条消息比nNumberOfBytesToRead参数指定的长度还大,那么ReadFile将返回FALSE并且GetLastError返回错误为ERROR_MORE_DATA。剩下没读完的消息可能会被随后的ReadFile或PeckNamedPipe函数读出。
    读取一个通信设备时,ReadFile的行为被当前的通信延时所支配,延时属性的设置和取得使用SetCommTimeouts和GetCommTimeouts函数。如果你设置延时属性失败,就会得到不可预知的结果。
    如果ReadFile试图读取一个buffer太小的邮槽,将会返回FALSE并且GetLastError返回错误为ERROR_INSUFFICIENT_BUFFER 。
    如果一个匿名的写管道句柄已经关闭,而ReadFile试图用响应的匿名权限读这个管道句柄,将返回FALSE并且
GetLastError返回错误为ERROR_BROKEN_PIPE。
    每当有太多的异步I/O请求得不到响应,ReadFile就会失败,并返回ERROR_INVALID_USER_BUFFER或ERROR_NOT_ENOUGH_MEMORY的错误。
    在同步和异步两种情况下,ReadFile中检测EOF(文件结尾边界)的代码是不同的。当一个同步读操作到达文件结尾时,ReadFile返回TRUE,并设置*lpNumberOfBytesRead 为0 。异步读操作会在开始调用的读操作中或者随后的其他异步操作中突然遇到文件结尾。(1)如果EOF在ReadFile期间被检测到,将会返回FALSE,且 GetLastError返回错误描述 ERROR_HANDLE_EOF。(2)如果EOF在随后的其他异步操作中被检测到,则类似GetOverlappedResult 等试图获取操作结果的函数返回FALSE,且 GetLastError返回错误描述ERROR_HANDLE_EOF。
    为了取消未响应的异步I/O操作,用CancelIo函数。这个函数只能取消由调用进程对特定句柄进行的操作。被取消的I/O操作将被描述为ERROR_OPERATION_ABORTED。
    如果你正试图从并不存在的软驱中读数据,系统会弹出消息框提示你重新操作。为了阻止系统的消息框,调用函数SetErrorMode,参数设置为SEM_NOOPENFILEERRORBOX。

分享到:
评论

相关推荐

    Win32API参考手册中文版

    Win32 API(Application Programming Interface)是微软Windows操作系统的核心组件,为开发者提供了丰富的函数和接口,使得程序员可以创建与操作系统紧密交互的应用程序。这本"Win32 API参考手册中文版"是开发者的...

    Win32API函数参考手册.zip

    文件操作是任何应用程序都绕不开的话题,Win32 API中的`CreateFile`、`ReadFile`和`WriteFile`函数构成了基本的文件I/O操作。还有`FindFirstFile`和`FindNextFile`用于遍历文件和目录,`DeleteFile`和`MoveFile`则...

    win api 完全中文手册

    6. **文件和注册表操作**:CreateFile、ReadFile、WriteFile用于文件读写,RegOpenKeyEx、RegSetValueEx等函数则涉及注册表的访问和修改。 7. **网络编程**:如Winsock库,提供了套接字相关的函数,如socket用于...

    使用Win32API实现Windows下异步串口通讯_异步串口通讯_

    本文将详细讲解如何利用Win32 API来实现这一功能。 1. 异步非阻塞串口通讯的优点 异步串口通信的最大优势在于其非阻塞特性。在同步模式下,程序会等待数据接收或发送完成才继续执行,可能导致程序响应变慢。而异步...

    WIN32 API使用基础(SDK英文原版)

    **Win32 API 使用基础(SDK 英文原版)** Win32 API,全称为Windows API(Application Programming Interface),是微软为Windows操作系统提供的一套底层接口,它允许程序员访问和控制系统的各种功能,如窗口管理、...

    Win32 API大全_Win32API_

    7. **文件系统操作**:Win32 API提供了读写文件、创建删除文件和目录的函数,如CreateFile、ReadFile、WriteFile和DeleteFile。此外,FindFirstFile和FindNextFile用于文件和目录的搜索。 8. **注册表操作**:...

    Win32 api手册

    Win32 API(Application Programming Interface)是微软为32位操作系统设计的一套全面的系统级接口,主要用于在Windows环境下开发应用程序。它包含了丰富的函数、结构、消息和常量,覆盖了用户界面、系统管理、网络...

    Win32 API.

    4. **文件操作**:Win32 API提供了诸如CreateFile、ReadFile、WriteFile等函数,用于对磁盘上的文件进行读写操作。此外,还包括DeleteFile、MoveFile等用于文件管理和重命名的函数。 5. **内存管理**:内存管理是...

    win32_API_WIN32_API.CHM_

    4. **文件操作**:Win32 API提供了一整套文件I/O函数,如`CreateFile`用于打开或创建文件,`ReadFile`和`WriteFile`读写文件内容,`CloseHandle`关闭文件句柄。 5. **进程和线程管理**:开发者可以使用Win32 API...

    Win32API参考手册简体中文版

    Win32 API(Application Programming Interface)是微软为开发者提供的用于编写Windows操作系统下应用程序的接口。这个接口包含了大量函数、常量、结构体和消息,使得程序员可以与操作系统进行交互,实现各种功能。...

    win_api.rar_API_WIN API_win api chm_windows api_windows api chm

    《深入探索Windows API:函数分类与使用指南》 Windows API,全称为Application Programming...通过阅读"win_api.chm"这样的API参考手册,结合实践编写代码,可以逐步熟练运用Windows API,创造出功能丰富的应用程序。

    win32 api教程

    文件操作也是必不可少的一部分,Win32 API提供了`CreateFile`、`ReadFile`、`WriteFile`等函数来读写文件,以及`FindFirstFile`、`FindNextFile`用于文件查找。 网络通信方面,Win32 API的Winsock库提供了低级别的...

    Win32 API大全

    《新编Win32 API大全》是一本涵盖了广泛Windows编程接口知识的专业书籍,分为第一版和第二版。这本书深入解析了Win32 API,为Windows应用程序开发提供了详尽的参考资料。Win32 API是Microsoft Windows操作系统的核心...

    win api labview

    6. **文件操作**:API函数如CreateFile、ReadFile、WriteFile等,用于读写文件,配合LabVIEW的文件I/O功能,可以实现对文件系统的高级操作。 7. **错误处理**:使用GetLastError和FormatMessage等API,可以获取并...

    Win API实例(对于学习windows编程帮助极大!)

    在Windows操作系统中,Win API(Windows Application Programming Interface)是一组函数、常量、数据类型和消息,它们为开发者提供了与操作系统交互的接口。Win API实例是学习Windows编程的基础,尤其对于初学者而...

    Win32API API函数 WindowsAPI函数

    Win32API,全称Windows API(Application Programming Interface),是微软为Windows操作系统提供的一套庞大的函数库,用于帮助开发者创建Windows应用程序。这个API包含了丰富的功能,涵盖了从基本的窗口管理到复杂...

    新编Win32API大全 + Windows API 指南

    《新编Win32API大全》与《Windows API 指南》是两本深入探讨Windows操作系统编程的重要参考资料。在程序开发领域,尤其是涉及到Windows平台的应用程序开发时,对Win32 API的深入理解和熟练应用至关重要。Win32 API是...

    win32API 函数库

    Win32 API的`CreateFile`函数用于打开或创建文件,`ReadFile`和`WriteFile`用于读写文件内容,`CloseHandle`关闭已打开的文件句柄。此外,还有`FindFirstFile`和`FindNextFile`用于文件搜索,`DeleteFile`和`...

    Win32API.hlp帮助文件

    8. **文件和I/O操作**:包括打开、关闭、读写文件的API,如`CreateFile`、`ReadFile`、`WriteFile`等,以及文件映射和管道通信。 9. **图形设备接口(GDI)**:Win32 API提供了丰富的图形绘制功能,如`CreateDC`...

    win32 sdk用windows api开发exe

    本文将深入探讨如何利用VC++和Win32 API SDK进行Windows应用程序的开发。 首先,Win32 API是微软提供的一个编程接口,它允许开发者使用C或C++语言来编写运行于Windows操作系统上的应用程序。API包含了众多函数、...

Global site tag (gtag.js) - Google Analytics