ReadFile函数
函數功能:該函數從文件指針指示的位置開始從文件讀數據,在讀操作完成后,如果文件句柄不是用重疊屬性來創建,則文件指針用實際讀的字數來調整。
如果文件句柄為重疊的輸入和輸出(I/O)操作而創建,則應用程序必須在讀操作之后調整文件指針的位置。
函數原型:BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
參數:
hFile:指向要讀的文件的句柄,文件句柄一定用 GENERIC_READ 對文件的訪問來創建。
Windows NT:對于異步讀操作,hFile 可為任何一個句柄,該句柄可以通過 CreatFile函數用 FILE_FLAG_OVERLAPPED 標志來打開或通過插孔或接收函數返回的插孔句柄來打開。
Windows 95:對于異步讀操作,hFILE 可以是一個通信源、郵件插孔或命名的管道句柄,此管道句柄通過 CreatFile 用 FILE_FLAG_OVERLAPPED 標志來打開或通過插孔或接收函數返回的插孔句柄來打開,Windows 95 不支持磁盤文件的異步讀操作。
lpBuffer:指向一個從文件存取數據的緩沖區的指針。
nNumberOfBytesToRead:從文件讀的字節數目。
lpNumberOfBytesRead:指向一個讀字節數的指針,在做任何工作或錯誤檢測之前,ReadFile 把此值設置為零,當 ReadFile 在命名管道上返回 TRUE 時,如果此參數為零,則用 nNumberOfBytesToWrite 調用 WriteFile 函數的信息模塊將管道的另一端設置為零。
Windows NT:如果 lpOverlapped 為 NULL,則 lpNumberOfBytesRead 不為 NULL;如果 lpOverlapped 不為 NULL,則 lpNumberOfBytesRead 可以為 NULL,如果這是一個重疊寫操作,則可通過調用 GetQueuedCompletionStatu
s 來得到讀字節的數目。
Windows 95 或 Windows 98:此參數不能為 NULL。
lpOverlapped:指向一個OVERLAPPED 結構的指針,如果用 FILE_FLAG_OVERLAPPED 來創建 hFile,則需要此結構,如果用 FILE_FLAG_OVERLAPPED 來打開 hFile,則 lpOverlapped 參數一定不是 NULL,它必須指向一個有效的 OVERLAPPED結構,如果 hFile 是由 FILE_FLAG_OVERLAPPED 創建且 lpOverlapped 為 NULL,則函數可不正確地記錄關于讀操作是完全的。
如果 hFile 用 FILE_FLAG_OVERLAPPED 打開,且 lpOverlapped 不為 NULL,則讀操作在 OVERLAPPED 結構中指定的位移處開始,在完成操作之前,且 ReadFile 可以返回在這種情況下 ReadFile 返回 FALSE 且 GetLastError 函數返回 ERROR_IO_PENDING 這使在讀操作完成時,調用應用系統繼續。在 OVERLAPPED 結構中指定的事件被設置為讀操作完成的發送信號狀態。
如果 hFile 不用 FILE_FLAG_OVERLAPPED 打開,且 lpOverlapped 不為 NULL,則讀操作在當前文件位置開始且至操作完成,ReadFile 函數返回。
如果 hFile 不用 FILE_FLAG_OVERLAPPED 打開,且 lpOverlapped 不為 NULL,則讀操作 OVERLAPPED 結構指定的位移處開始,直到操作完成,ReadFile 函數返回。
返回值:當下列之一的為真時,ReadFile 函數返回。寫操作的管道寫終端完成,請求讀的字節數目或出現錯誤。如果函數調用成功,則返回值為非零值。如果返回值為非零值,且讀字節數目為零,則在讀操作時文件指針超出文件終端。但是,如果文件用 FILE_FLAG_OVERLAPPED 打開且 lpOverlapped 不為 NULL,則返回值為 FALSE,且當文件指針超過文件當前終端時 GetLastError 函數返回 ERROR_HANDLE_EOF。如果函數調用失敗,則返回值為零。若想獲得更多錯誤信息,請調用 GetLastError 函數。
文件訪問一定在文件內字節位移處開始,該文件為容量扇區大小的整數倍,為決定一個容量扇區的大小,調用 GetDiskFreeSpace 函數。
文件訪問必須是對于字節數目的訪問,該字節數目為容量扇區大小的整數倍,例如如果扇區大小為512字節,應用程序可以請求512、1024或2048字節的讀和寫訪問,但不是335、981、7171字節。緩沖區對讀、寫操作的地址一定為對齊扇區(在內存地址上對齊,該內存為容量扇區大小的整數倍)。一種對齊扇區的緩沖區的方法是用 VirtualAlloc 函數來分配緩沖區,此函數分配內存,該內存在為系統頁面大小的整數倍的地址上對齊,因為無論是頁面還是扇區大小都是2的冪,用系統頁面大小的倍數對齊的內存也可用容量扇區大小的倍數來對齊調整(‘對齊’改為‘調整’)。
在讀操作正在有緩沖區時訪問輸入緩沖區,則可導致輸入緩沖區數據的破壞,直到讀操作完成為止,應用程序才能讀、寫重分配或釋放一個正被一個讀操作使用的輸入緩沖區。
如果一個命名的管道正在信息模塊中讀且狹義個信息比 nNumberOfBytesToRead 參數長,則 ReadFile 返回 FALSE 且 GetLastError 返回 ERROR_MODE_DATA,剩下的信息也許通過下一次對 ReadFile 或 PeekNamePipe 函數的調用來讀。
當從通信設備來讀數據時,且當用 SetCommTimeouts 和 GetCommTimeouts 函數來設置和檢取超時時,ReadFile的行為由當前通信超時來操縱,如果不能設置超時時,則會出現不可預料的結果,有關信息超時更詳細的資料,參見 COMMTIMEOUTS。
如果 ReadFile 試圖從緩沖區太小的郵件插孔讀數據,則函數返回 FALSE 且 GetLastError 函數返回 ERROR_INSUFFICENT_BUFFER。
如果匿名寫通道句柄已經被關閉且 ReadFile 試圖用相應的匿名讀通道句柄來讀,則函數返回 FALSE 且 GetLastError 返回 ERROR_BROKEN_PIPE。
當不足夠多的明顯異步 I/O 請求時,ReadFile 函數可能失敗且返回 ERROR_INVALID_USER_BUFFER 或 ERROR_NOT_ENOUGH_MEMORY。
ReadFile 代碼為狀態文件終端而檢測與異步和同步讀操作不同。
當一個同步讀操作到達文件末尾時,ReadFile 返回 TRUE 且把 lpNumberOfBytesResd 設置為零,下列樣本代碼用來為同步讀操作文件末尾的檢測。
// Attempt a synchronous read operation
bResut = ReadFile(hFile, &inBuffer, nBytesToRead, &nBytesRead, NULL);
// Check for end of file
if(bResult&nBytesRead==0)
{// we're at the end of the file}
在其始的 ReadFile 調用期間,或下一步異步操作期間,一個異步讀操作可以遇到文件的末尾。
如果對于異步讀操作在 ReadFile 時間 EOF 被刪除,則 ReadFile 返回 FALSE 且 GetLastError 返回 ERROR_HANDLE_EOF。
如果下一次異步操作期間 EOF 被刪除,對 GetOverlappedResult 的調用,可以導致操作返回 FALSE 且 GetError 返回 ERROR_HANDLE_EOF。
用 Cancel 函數來取消所有未知異步 I/O 操作,此函數只取消由關于指定文件句柄的調用線程發布的操作,被取消的 I/O 操作用錯誤 ERROR_OPERATION_ABORTED 來完成。
如果試圖從一個沒有軟盤的軟驅中讀數據,則系統顯示一個信息框告訴用戶重新執行此操作,為避免系統顯示此信息框,用 SEM_NOOPENFILEERRORBOX 來調用 SetErrorMode 函數。
Windows CE:lpOverlapped 參數一定被設置為 NULL,Windows CE 不允許用重疊屬性來創建文件,Windows CE 不支持對文件的異步讀操作。
速查:Windows NT 3.1及以上版本、Windows 95及以上版本、Windows CE 1.0及以上版本,頭文件:winbase.h;庫文件:kernel32.lib。
總結
以上是生活随笔為你收集整理的ReadFile函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: itext设置pdf的尺寸_如何获取pd
- 下一篇: 12个免费在线的Web网站性能测试工具