ReadFile

ReadFile

檔案指針指向的位置開始將數據讀出到一個檔案中, 且支持同步和異步操作,

如果檔案打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程式調用成功時,它將實際讀出檔案的位元組數保存到lpNumberOfBytesRead指明的地址空間中。

FILE_FLAG_OVERLAPPED 允許對檔案進行重疊操作

如果檔案要互動使用的話,當函式調用完畢時要記得調整檔案指針。

從檔案中讀出數據。與fread函式相比,這個函式要明顯靈活的多。該函式能夠操作通信設備、管道、套接字以及郵槽。

基本介紹

  • 中文名:ReadFile
  • 相比:fread函式
  • 參數:接收數據的緩衝區
  • 功能說明:支持同步和異步操作
函式原型,功能說明,參數說明,返回值,套用實例,

函式原型

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 代表沒有任何錯誤}

相關詞條

熱門詞條

聯絡我們