|
Overview |
|
|
|
Group |
|
|
|
Quick Info
Windows NT
| Yes
| Win95
| Yes
| Win32s
| Yes
| Import Library
| kernel32.lib
| Header File
| winbase.h
| Unicode
| No
| Platform Notes
| Windows 95: No overlapped regions, except for serial devices
|
|
|
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 function, or a socket handle returned by the
socket or
accept functions.
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 function with
nNumberOfBytesToWrite set to zero.
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. If
hFile is associated with an I/O completion port, you can get the number of bytes
read by calling
GetQueuedCompletionStatus.
lpOverlapped
Points to an
OVERLAPPED structure. This structure is required if
hFile was created with FILE_FLAG_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 returns ERROR_HANDLE_EOF when the file pointer goes beyond the current end of
file.
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 returns ERROR_MORE_DATA. The remainder of the message may be read by a
subsequent call to the
ReadFile or
PeekNamedPipe function.
When reading from a communications device, the behavior of
ReadFile is governed by the current communication timeouts as set and retrieved using
the
SetCommTimeouts and
GetCommTimeouts functions. Unpredictable results can occur if you fail to set the timeout
values. For more information about communication timeouts, see
COMMTIMEOUTS.
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 function. This function only cancels operations issued by the calling thread
for the specified file handle. I/O operations that are canceled complete with
the error ERROR_OPERATION_ABORTED.
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
CancelIo,
CreateFile,
GetCommTimeouts,
GetOverlappedResult,
GetQueuedCompletionStatus,
OVERLAPPED,
PeekNamedPipe,
ReadFileEx,
SetCommTimeouts,
WriteFile
- Software for developers
-
Delphi Components
.Net Components
Software for Android Developers
- More information resources
-
MegaDetailed.Net
Unix Manual Pages
Delphi Examples
- Databases for Amazon shops developers
-
Amazon Categories Database
Browse Nodes Database