ReadFile
The ReadFile
function reads data from a file, starting at the position indicated by the file
pointer. After the read operation has been completed, the file pointer is
adjusted by the number of bytes actually read, unless the file handle is
created with the overlapped attribute. If the file handle is created for
overlapped input and output (I/O), the application must adjust the position of
the file pointer after the read operation.
BOOL ReadFile(
HANDLE hFile, |
// handle of file
to read |
LPVOID lpBuffer, |
// address of
buffer that receives data |
DWORD nNumberOfBytesToRead, |
// number of bytes
to read |
LPDWORD lpNumberOfBytesRead, |
// address of
number of bytes read |
LPOVERLAPPED lpOverlapped |
// address of
structure for data |
); |
|
Parameters
hFile
Identifies
the file to be read. The file handle must have been created with GENERIC_READ
access to the file.
Windows
NT
For
asynchronous read operations, hFile can be any handle opened with the
FILE_FLAG_OVERLAPPED flag by the CreateFile
Windows
95
For
asynchronous read operations, hFile can be a communications resource,
mailslot, or named pipe handle opened with the FILE_FLAG_OVERLAPPED flag by CreateFile,
or a socket handle returned by the socket or accept functions.
Windows 95 does not support asynchronous read operations on disk files.
lpBuffer
Points to the
buffer that receives the data read from the file.
nNumberOfBytesToRead
Specifies the
number of bytes to be read from the file.
lpNumberOfBytesRead
Points to the
number of bytes read. ReadFile sets this value to zero before doing any
work or error checking. If this parameter is zero when ReadFile returns
TRUE on a named pipe, the other end of the message-mode pipe called the WriteFile
If lpOverlapped
is NULL, lpNumberOfBytesRead cannot be NULL.
If lpOverlapped
is not NULL, lpNumberOfBytesRead can be NULL. If this is an overlapped
read operation, you can get the number of bytes read by calling GetOverlappedResult
lpOverlapped
Points to an OVERLAPPED
If hFile was opened with FILE_FLAG_OVERLAPPED, the lpOverlapped
parameter must not be NULL. It must point to a valid OVERLAPPED
structure. If hFile was created with FILE_FLAG_OVERLAPPED and lpOverlapped
is NULL, the function can incorrectly report that the read operation is
complete.
If hFile was opened with FILE_FLAG_OVERLAPPED and lpOverlapped
is not NULL, the read operation starts at the offset specified in the OVERLAPPED
structure and ReadFile may return before the read operation has been
completed. In this case, ReadFile returns FALSE and the GetLastError
function returns ERROR_IO_PENDING. This allows the calling process to continue
while the read operation finishes. The event specified in the OVERLAPPED
structure is set to the signaled state upon completion of the read operation.
If hFile was not opened with FILE_FLAG_OVERLAPPED and lpOverlapped
is NULL, the read operation starts at the current file position and ReadFile
does not return until the operation has been completed.
If hFile is not opened with FILE_FLAG_OVERLAPPED and lpOverlapped
is not NULL, the read operation starts at the offset specified in the OVERLAPPED
structure. ReadFile does not return until the read operation has been
completed.
Return Values
If the
function succeeds, the return value is nonzero.
If the return
value is nonzero and the number of bytes read is zero, the file pointer was
beyond the current end of the file at the time of the read operation. However,
if the file was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is not
NULL, the return value is FALSE and GetLastError
If the
function fails, the return value is zero. To get extended error information,
call GetLastError.
Remarks
ReadFile returns when one of the following is true: a write operation
completes on the write end of the pipe, the number of bytes requested has been
read, or an error occurs.
If part of
the file is locked by another process and the read operation overlaps the
locked portion, this function fails.
Applications
must not read from nor write to the input buffer that a read operation is using
until the read operation completes. A premature access to the input buffer may
lead to corruption of the data read into that buffer.
Characters
can be read from the console input buffer by using ReadFile with a
handle to console input. The console mode determines the exact behavior of the ReadFile
function.
If a named
pipe is being read in message mode and the next message is longer than the nNumberOfBytesToRead
parameter specifies, ReadFile returns FALSE and GetLastError
When reading
from a communications device, the behavior of ReadFile is governed by
the current communication timeouts as set and retrieved using the SetCommTimeouts34JJAA.
If ReadFile
attempts to read from a mailslot whose buffer is too small, the function
returns FALSE and GetLastError returns ERROR_INSUFFICIENT_BUFFER.
If the
anonymous write pipe handle has been closed and ReadFile attempts to
read using the corresponding anonymous read pipe handle, the function returns
FALSE and GetLastError returns ERROR_BROKEN_PIPE.
The ReadFile
function may fail and return ERROR_INVALID_USER_BUFFER or
ERROR_NOT_ENOUGH_MEMORY whenever there are too many outstanding asynchronous
I/O requests.
The ReadFile
code to check for the end-of-file condition (eof) differs for synchronous
and asynchronous read operations.
When a
synchronous read operation reaches the end of a file, ReadFile returns
TRUE and sets *lpNumberOfBytesRead to zero. The following sample code
tests for end-of-file for a synchronous read operation:
// attempt a synchronous read operation
bResult = ReadFile(hFile, &inBuffer, nBytesToRead,
&nBytesRead, NULL) ;
// check for eof
if (bResult && nBytesRead == 0, ) {
// we re
at the end of the file
}
An
asynchronous read operation can encounter the end of a file during the
initiating call to ReadFile, or during subsequent asynchronous
operation.
If EOF is
detected at ReadFile time for an asynchronous read operation, ReadFile
returns FALSE and GetLastError returns ERROR_HANDLE_EOF.
If EOF is
detected during subsequent asynchronous operation, the call to GetOverlappedResult
to obtain the results of that operation returns FALSE and GetLastError returns
ERROR_HANDLE_EOF.
To cancel all
pending asynchronous I/O operations, use the CancelIO
The following
sample code illustrates testing for end-of-file for an asynchronous read
operation:
// set up overlapped structure fields
// to simplify this sample, we'll eschew an event
handle
gOverLapped.Offset = 0;
gOverLapped.OffsetHigh = 0;
gOverLapped.hEvent = NULL;
// attempt an asynchronous read operation
bResult = ReadFile(hFile, &inBuffer,
nBytesToRead, &nBytesRead,
&gOverlapped) ;
// if there was a problem, or the async. operation's
still pending ...
if (!bResult)
{
// deal
with the error code
switch
(dwError = GetLastError())
{
case
ERROR_HANDLE_EOF:
{
//
we're reached the end of the file
//
during the call to ReadFile
//
code to handle that
}
case
ERROR_IO_PENDING:
{
//
asynchronous i/o is still in progress
//
do something else for a while
GoDoSomethingElse() ;
//
check on the results of the asynchronous read
bResult = GetOverlappedResult(hFile, &gOverlapped,
&nBytesRead, FALSE) ;
//
if there was a problem ...
if
(!bResult)
{
// deal with the error code
switch (dwError = GetLastError())
{
case ERROR_HANDLE_EOF:
{
// we're reached the
end of the file
//during asynchronous operation
}
// deal with other error cases
}
}
} //
end case
//
deal with other error cases
} // end
switch
} // end if
See Also