1. CreateFile:這是一個多功能的函數,可打開或創建以下對象,並返回可訪問的句柄:控制台,通信資源,目錄(只讀打開),磁盤驅動器,文件,郵槽,管道。
參照:http://www.cppblog.com/yishanhante/articles/19545.html
2. ReadFile:從文件指針指向的位置開始將數據讀出到一個文件中, 且支持同步和異步操作
BOOL ReadFile(
HANDLEhFile,
//文件的句柄
LPVOIDlpBuffer,
//用於保存讀入數據的一個緩沖區
DWORDnNumberOfBytesToRead,
//要讀入的字節數
LPDWORDlpNumberOfBytesRead,
//指向實際讀取字節數的指針
LPOVERLAPPEDlpOverlapped
//如文件打開時指定了FILE_FLAG_OVERLAPPED,那么必須,用這個參數引用一個特殊的結構。
//該結構定義了一次異步讀取操作。否則,應將這個參數設為NULL
);
參數說明
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參數指定的值,表明早已抵達了文件的結尾。
3.
BOOL WriteFile(
HANDLEhFile,
//文件句柄
LPCVOIDlpBuffer,
//數據緩存區指針
DWORDnNumberOfBytesToWrite,
//你要寫的字節數
LPDWORDlpNumberOfBytesWritten,
//用於保存實際寫入字節數的存儲區域的指針
LPOVERLAPPEDlpOverlapped
//OVERLAPPED結構體指針
);
例子:
1.利用CreateFile和ReadFile獲取文件的buffer
1 voidReadFile(char*str) 2 { 3 HANDLEpfile; 4 pfile=::CreateFile(str,GENERIC_READ,0,NULL,OPEN_EXISTING, 5 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS,NULL);//用這個函數比OpenFile好 6 if(pfile==INVALID_HANDLE_VALUE) 7 { 8 MessageBox(NULL,"打開文件失敗","Error",MB_OK); 9 CloseHandle(pfile);//一定注意在函數退出之前對句柄進行釋放。 10 return; 11 } 12 DWORDfilesize=GetFileSize(pfile,NULL); 13 char*buffer=newchar[filesize+1];//最后一位為'/0',C-Style字符串的結束符。 14 DWORDreadsize=0; 15 ReadFile(pfile,buffer,filesize,&readsize,NULL); 16 17 memset(buffer,0,filesize+1); 18 19 buffer[filesize]=0; 20 MessageBox(NULL,buffer,"BufferSize",MB_OK); 21 //善后工作 22 delete[]buffer;//注意是delete[]而不是delete 23 CloseHandle(pfile);//關閉句柄。 24 }
2.利用CreateFile、ReadFile和 WriteFile實現CopyFile函數
1 void MyCopyFile(wstring pExitFile,wstring pNewFile) 2 { 3 HANDLE pRfile; 4 pRfile=::CreateFile(pExitFile.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, 5 FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS,NULL);//用這個函數比OpenFile好 6 if(pRfile==INVALID_HANDLE_VALUE) 7 { 8 //MessageBox(NULL,"打開文件失敗","Error",MB_OK); 9 CloseHandle(pRfile);//一定注意在函數退出之前對句柄進行釋放。 10 return ; 11 } 12 DWORD filesize=GetFileSize(pRfile,NULL); 13 char*buffer=new char[filesize+1];//最后一位為'/0',C-Style字符串的結束符。 14 memset(buffer,0,filesize+1); 15 DWORD readsize=0; 16 ReadFile(pRfile,buffer,filesize,&readsize,NULL); 17 buffer[filesize]=0; 18 CloseHandle(pRfile);//關閉句柄 19 20 //寫數據 21 22 HANDLE pWfile; 23 pWfile=::CreateFile(pNewFile.c_str(),GENERIC_WRITE|GENERIC_READ,0,NULL,CREATE_ALWAYS, 24 FILE_ATTRIBUTE_NORMAL,NULL);//用這個函數比OpenFile好 25 if(pWfile==INVALID_HANDLE_VALUE) 26 { 27 //MessageBox(NULL,"打開文件失敗","Error",MB_OK); 28 CloseHandle(pWfile);//一定注意在函數退出之前對句柄進行釋放。 29 return ; 30 } 31 32 DWORD writesize = 0; 33 34 ::WriteFile(pWfile,buffer,filesize,&writesize,NULL); 35 36 //善后工作 37 delete[]buffer;//注意是delete[]而不是delete 38 CloseHandle(pWfile);//關閉句柄 39 }