複製鏈接
請複製以下鏈接發送給好友

ReadFile

鎖定
文件指針指向的位置開始將數據讀出到一個文件中, 且支持同步和異步操作,
中文名
ReadFile
外文名
ReadFile
相    比
fread函數
參    數
接收數據的緩衝區
功能説明
支持同步和異步操作

ReadFile函數原型

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結構。

ReadFile功能説明

如果文件打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程序調用成功時,它將實際讀出文件的字節數保存到lpNumberOfBytesRead指明的地址空間中。
FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作
如果文件要交互使用的話,當函數調用完畢時要記得調整文件指針。
從文件中讀出數據。與fread函數相比,這個函數要明顯靈活的多。該函數能夠操作通信設備、管道、套接字以及郵槽。

ReadFile參數説明

HANDLE hFile, 需要讀入數據的文件指針,這個指針指向的文件必須是GENERIC_READ 訪問屬性的文件。
LPVOID lpBuffer,接收數據的緩衝區。
DWORD nNumberOfBytesToRead,指定要讀取的字節數。
LPDWORD lpNumberOfBytesRead,指向一個DWORD類型變量的指針,用來接收讀取的字節數。如果下一個參數為NULL,那麼一定要傳入這個參數。
LPOVERLAPPED lpOverlapped OVERLAPPED結構體指針,如果文件是以FILE_FLAG_OVERLAPPED方式打開的話,那麼這個指針就不能為NULL。
FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作

ReadFile返回值

調用成功,返回非0
調用不成功,返回為0
會設置GetLastError。如啓動的是一次異步讀操作,則函數會返回零值,並將ERROR_IO_PENDING設置成GetLastError的結果。如結果不是零值,但讀入的字節數小於nNumberOfBytesToRead參數指定的值,表明早已抵達了文件的結尾。

ReadFile應用實例

//  讀取文件內容,針對文件不太大的情況,文件太大需要分段讀取,如果發生錯誤,則返回錯誤值
//  此函數為簡單示例,不考慮重疊操作,重疊操作 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(LPTR, dwSize);                       //  申請緩衝區,下面的 ReadFile 裏面會判斷這裏申請是否成功

    if (FALSE == ReadFile(hFile, pData, dwSize, &dwSize, NULL))     //  讀取文件失敗,記錄失敗錯誤值
        dwErr = GetLastError();

    CloseHandle(hFile);                                             //  關閉文件句柄,避免句柄泄露
    return dwErr;                                                   //  返回錯誤值,NO_ERROR 代表沒有任何錯誤
}