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 }