VC++ 利用CreateFile、ReadFile和WriteFile實現CopyFile


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 }

 


免責聲明!

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



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