函式原型
BOOL ReadFile( HANDLE hFile, //檔案的句柄 LPVOID lpBuffer, //用於保存讀入數據的一個緩衝區 DWORD nNumberOfBytesToRead, //要讀入的位元組數 LPDWORD lpNumberOfBytesRead, //指向實際讀取位元組數的指針 LPOVERLAPPED lpOverlapped //如檔案打開時指定了FILE_FLAG_OVERLAPPED,那么必須,用這個參數引用一個特殊的結構。 //該結構定義了一次異步讀取操作。否則,應將這個參數設為NULL);
FILE_FLAG_OVERLAPPED
檔案或設備被打開或創建異步I / O。
當後續的I / O操作完成這個句柄,OVERLAPPED結構中指定的事件 將被設定為有信號狀態。
如果這個標誌被指定,該檔案可用於同時讀取和寫入操作。
如果沒有指定這個標誌,然後被序列化I / O操作,即使調用讀寫函式指定一個OVERLAPPED結構。
功能說明
從
檔案指針指向的位置開始將數據讀出到一個檔案中, 且支持同步和異步操作,
如果檔案打開方式沒有指明
FILE_FLAG_OVERLAPPED的話,當程式調用成功時,它將實際讀出檔案的位元組數保存到lpNumberOfBytesRead指明的
地址空間中。
FILE_FLAG_OVERLAPPED 允許對檔案進行重疊操作
如果檔案要互動使用的話,當
函式調用完畢時要記得調整檔案指針。
從檔案中讀出數據。與fread函式相比,這個函式要明顯靈活的多。該函式能夠操作通信設備、管道、
套接字以及郵槽。
參數說明
HANDLE hFile, 需要讀入數據的
檔案指針,這個指針指向的檔案必須是GENERIC_READ 訪問屬性的檔案。
LPVOID lpBuffer,接收數據的緩衝區。
DWORD nNumberOfBytesToRead,指定要讀取的位元組數。
LPDWORD lpNumberOfBytesRead,指向一個DWORD類型變數的指針,用來接收讀取的位元組數。如果下一個參數為NULL,那么一定要傳入這個參數。
LPOVERLAPPED lpOverlapped OVERLAPPED結構體
指針,如果檔案是以
FILE_FLAG_OVERLAPPED方式打開的話,那么這個指針就不能為NULL。
FILE_FLAG_OVERLAPPED 允許對檔案進行重疊操作
返回值
調用成功,返回非0
調用不成功,返回為0
會設定GetLastError。如啟動的是一次異步讀操作,則函式會返回零值,並將ERROR_IO_PENDING設定成GetLastError的結果。如結果不是零值,但讀入的位元組數小於nNumberOfBytesToRead參數指定的值,表明早已抵達了檔案的結尾。
套用實例
// 讀取檔案內容,針對檔案不太大的情況,檔案太大需要分段讀取,如果發生錯誤,則返回錯誤值// 此函式為簡單示例,不考慮重疊操作,重疊操作 ReadFile 需傳入最後一個參數// LPCTSTR lpPath 輸入參數,需要讀取檔案內容的路徑// PBYTE& pData 輸出參數,返回讀取的檔案內容// DWORD& dwSize 輸出參數,返回讀取的檔案內容大小DWORD WINAPI ReadFileContent(IN LPCTSTR lpPath, IN OUT PBYTE& pData, IN OUT DWORD& dwSize) { DWORD dwErr = NO_ERROR; HANDLE hFile = CreateFile(lpPath, FILE_GENERIC_READ, // 打開檔案,獲得檔案讀句柄 FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, // 共享方式打開,避免其他地方需要讀寫此檔案 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE == hFile) // 檔案打開失敗,返回錯誤值 return GetLastError(); dwSize = GetFileSize(hFile, NULL); // 取檔案大小,這裡的檔案不能太大,否則需要分段讀取檔案 pData = (PBYTE)LocalAlloc(GPTR, dwSize); // 申請緩衝區,下面的 ReadFile 裡面會判斷這裡申請是否成功 if (FALSE == ReadFile(hFile, pData, dwSize, &dwSize, NULL)) // 讀取檔案失敗,記錄失敗錯誤值 dwErr = GetLastError(); CloseHandle(hFile); // 關閉檔案句柄,避免句柄泄露 return dwErr; // 返回錯誤值,NO_ERROR 代表沒有任何錯誤}