ReadFileEx

【勇芳软件工作室】汉化HomePreviousNext

ReadFileEx功能从异步读取文件中的数据。它专为异步操作而设计,不同于专为同步和异步操作而设计的ReadFile功能。ReadFileEx允许应用程序在文件读取操作期间执行其他处理。

ReadFileEx功能异步报告其完成状态,当读取完成并且调用线程处于可警告的等待状态时,调用指定的完成例程。

BOOL ReadFileEx(

HANDLE 【HFILE】,//要处理的文件
LPVOID 【lpBuffer】,//缓冲区地址
DWORD 【nNumberOfBytesToRead】,//要读取的字节数
LPOVERLAPPED 【lpOverlapped的】,//偏移地址
LPOVERLAPPED_COMPLETION_ROUTINE 【lpCompletionRoutine】//完成例程的地址
); 

参数

【HFILE】

指定要读取的文件实体的打开句柄。必须使用FILE_FLAG_OVERLAPPED标志创建此文件句柄,并且必须对该文件具有GENERIC_READ权限。

Windows NT: 【HFILE】可以是通过CreateFile函数使用FILE_FLAG_OVERLAPPED标志打开的任何句柄,也可以由插座接受函数返回的套接字句柄。

Windows 95: 【HFILE】可以是通过CreateFile FILE_FLAG_OVERLAPPED标志打开的通信资源,邮槽或命名管道句柄,或由插座接受函数返回的套接字句柄。Windows 95不支持对磁盘文件的异步操作。

【lpBuffer】

指向缓冲区,接收从文件读取的数据。

该缓冲区必须在读取操作的持续时间内保持有效。在读取操作完成之前,应用程序不应使用此缓冲区。

【nNumberOfBytesToRead】

指定要从文件读取的字节数。

【lpOverlapped的】

指向OVERLAPPED数据结构,提供在异步(重叠)文件读取操作期间要使用的数据。

如果【HFILE】指定的文件支持字节偏移的概念,则ReadFileEx的调用者必须在文件中指定一个字节偏移量,读取开始时间。调用者通过设置OVERLAPPED结构的抵消OffsetHigh成员来指定字节偏移量。

如果【HFILE】指定的文件实体不支持字节偏移__的概念,例如,如果它是一个命名管道__,则调用者必须将抵消OffsetHigh成员设置为零或ReadFileEx失败。

ReadFileEx函数忽略OVERLAPPED结构的活动成员。在ReadFileEx呼叫的上下文中,应用程序可以自由使用该成员进行自己的目的。ReadFileEx通过调用或排队调用【lpCompletionRoutine】指向的完成例程来完成其读取操作,因此不需要事件句柄。

ReadFileEx功能使用OVERLAPPED结构的内部InternalHigh成员。应用程序不应该设置这些成员。

【lpOverlapped的】指向的OVERLAPPED数据结构在读取操作期间必须保持有效。当文件读取操作正在进行时,它不应该是可以超出范围的变量。

【lpCompletionRoutine】

指向完成例程,当读取操作完成并且调用线程处于可警告的等待状态时被调用。有关完成例程的更多信息,请参阅FileIOCompletionRoutine.

返回值

如果函数成功,返回值不为零。

如果函数失败,返回值为零。要获取扩展错误信息,请调用GetLastError.

如果函数成功,调用线程将异步I / O(输入/输出)操作挂起:从文件重写的读操作。当此I / O操作完成并且调用线程在可警告的等待状态下被阻止时,系统调用【lpCompletionRoutine】指向的功能,等待状态以WAIT_IO_COMPLETION的返回码完成。

如果功能成功,并且文件读取操作完成,但调用线程不处于可警告的等待状态,则系统对完成例程调用进行排队,保持调用,直到调用线程进入可警告的等待状态。有关警报等待和重叠输入/输出操作的信息,请参阅同步和重叠输入和输出.

如果ReadFileEx尝试读取超过文件的末尾,则该函数返回零,GetLastError返回ERROR_HANDLE_EOF。

备注

如果由【HFILE】指定的文件的一部分被其他进程锁定,并且在调用ReadFileEx中指定的读取操作与锁定部分重叠,则调用ReadFileEx将失败。

如果ReadFileEx尝试从缓冲区太小的邮槽读取数据,则该函数返回FALSE,GetLastError返回ERROR_INSUFFICIENT_BUFFER。

在读取操作完成之前,应用程序不得从读取操作正在读取或写入输入缓冲区。对输入缓冲区的过早访问可能导致读入该缓冲区的数据损坏。

如果异常I / O请求太多,ReadFileEx功能可能会失败。如果发生此类故障,GetLastError可以返回ERROR_INVALID_USER_BUFFER或ERROR_NOT_ENOUGH_MEMORY。

要取消所有挂起的异步I / O操作,请使用CancelIO功能。此函数仅取消调用线程为指定的文件句柄发出的操作。取消的I / O操作完成,错误ERROR_OPERATION_ABORTED。

如果【HFILE】是不支持字节偏移概念的命名管道或其他文件实体的句柄,则OVERLAPPED结构OVERLAPPED结构{OVERLAPPED}的OVERLAPPED成员必须为零,或ReadFileEx失败。

应用程序使用MsgWaitForMultipleObjectsExWaitForSingleObjectExWaitForMultipleObjectsExSleepEx函数来输入可警告的等待状态。有关警报等待和重叠输入/输出的更多信息,请参阅这些函数参考和同步.

Windows 95:在此平台上,通信端口不能使用ReadFileExWriteFileEx进行通信。但是,您可以使用ReadFileWriteFile来执行异步通信。

也可以看看

CancelIo, CreateFile, FileIOCompletionRoutine, MsgWaitForMultipleObjectsEx, OVERLAPPED, ReadFile, SleepEx, WaitForMultipleObjectsEx, WaitForSingleObjectEx, WriteFileEx