VC++ 利用CreateFile、ReadFile和WriteFile实现CopyFile

时间:2022-03-09 21:38:50

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 }