C/C++ 文件操作之CreateFile函數、ReadFile函數和WriteFile函數的用法


1.CreateFile最初是專門為文件交互而開發的,但后來被擴展和增強,以包括Windows開發人員可用的大多數其他類型的I / O設備和機制 

 

  HANDLE WINAPI CreateFile(   _In_      LPCTSTR lpFileName,                 _In_      DWORD dwDesiredAccess,   _In_      DWORD dwShareMode,   _In_opt_  LPSECURITY_ATTRIBUTES lpSecurityAttributes,   _In_      DWORD dwCreationDisposition,   _In_      DWORD dwFlagsAndAttributes,   _In_opt_  HANDLE hTemplateFile );


 

#include <stdio.h>
#include <windows.h>
int main()
{
    HANDLE hFILE=CreateFile("1.txt",GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    if(hFILE==INVALID_HANDLE_VALUE)
    {
        printf("CreateFile error\n");
        return 0;
    }
    if(SetFilePointer(hFILE,0,NULL,FILE_END)==-1)
    {
        printf("SetFilePointer error\n");
        return 0;
    }
    char buff[256]="hello";
    DWORD dwWrite;
    if(!WriteFile(hFILE,&buff,strlen(buff),&dwWrite,NULL))
    {
        printf("WriteFile error\n");
        return 0;
    }
    printf("write %d.\n",dwWrite);
    printf("done.\n");
    CloseHandle(hFILE);
    return 0;
}



 

 

2. ReadFile函數   從文件指針指向的位置開始將數據讀出到一個文件中, 且支持同步和異步操作,如果文件打開方式沒有指明FILE_FLAG_OVERLAPPED的話,當程序調用成功時,它將實際讀出文件的字節數保存到lpNumberOfBytesRead指明的地址空間中。FILE_FLAG_OVERLAPPED 允許對文件進行重疊操作。

  BOOL WINAPI ReadFile(   __in          HANDLE hFile,                   // 文件句柄   __out         LPVOID lpBuffer,                // 接收數據用的 buffer   __in          DWORD nNumberOfBytesToRead,     // 要讀取的字節數   __out         LPDWORD lpNumberOfBytesRead,    // 實際讀取到的字節數   __in          LPOVERLAPPED lpOverlapped       // OVERLAPPED 結構,一般設定為 NULL  );

 

BOOL Read(char *filePath) {     HANDLE pFile;     DWORD fileSize;     char *buffer,*tmpBuf;     DWORD dwBytesRead,dwBytesToRead,tmpLen;     pFile = CreateFile(filePath,GENERIC_READ,                   FILE_SHARE_READ,         NULL,                        OPEN_EXISTING,        //打開已存在的文件          FILE_ATTRIBUTE_NORMAL,          NULL);     if ( pFile == INVALID_HANDLE_VALUE)     {         printf("open file error!\n");         CloseHandle(pFile);         return FALSE;     }     fileSize = GetFileSize(pFile,NULL);          //得到文件的大小     buffer = (char *) malloc(fileSize);     ZeroMemory(buffer,fileSize);     dwBytesToRead = fileSize;     dwBytesRead = 0;     tmpBuf = buffer;     do{                                       //循環讀文件,確保讀出完整的文件             ReadFile(pFile,tmpBuf,dwBytesToRead,&dwBytesRead,NULL);         if (dwBytesRead == 0)             break;         dwBytesToRead -= dwBytesRead;         tmpBuf += dwBytesRead;         } while (dwBytesToRead > 0);         //  TODO 處理讀到的數據 buffer     free(buffer);     CloseHandle(pFile);     return TRUE; }

 

 3.WriteFile函數 

BOOL WINAPI WriteFile(   __in          HANDLE hFile,                   // 文件句柄   __in          LPCVOID lpBuffer,               // 要寫入的數據   __in          DWORD nNumberOfBytesToWrite,    // 要寫入的字節數   __out         LPDWORD lpNumberOfBytesWritten, // 實際寫入的字節數   __in          LPOVERLAPPED lpOverlapped       // OVERLAPPED 結構,一般設定為 NULL );

 

BOOL Write(char *buffer, DWORD contentLen) {     HANDLE pFile;     char *tmpBuf;     DWORD dwBytesWrite,dwBytesToWrite;     pFile = CreateFile(filePath,GENERIC_WRITE,                   0,         NULL,                        CREATE_ALWAYS,        //總是創建文件         FILE_ATTRIBUTE_NORMAL,          NULL);     if ( pFile == INVALID_HANDLE_VALUE)     {         printf("create file error!\n");         CloseHandle(pFile);         return FALSE;     }     dwBytesToWrite = contentLen;     dwBytesWrite = 0;     tmpBuf = buffer;     do{                                       //循環寫文件,確保完整的文件被寫入           WriteFile(pFile,tmpBuf,dwBytesToWrite,&dwBytesWrite,NULL);         dwBytesToWrite -= dwBytesWrite;         tmpBuf += dwBytesWrite;         } while (dwBytesToWrite > 0);     CloseHandle(pFile);     return TRUE; }

鏈接:https://www.365jz.com/article/24618
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

 

將數據寫入一個文件。該函數比fwrite函數要靈活的多。也可將這個函數應用於對通信設備、管道、套接字以及郵槽的處理。返回時,TRUE(非零)表示成功,否則返回零。會設置GetLastError

鏈接:https://www.365jz.com/article/24618
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM