先用同步模式来进行文件的写入操作
#include <iostream> #include<locale.h> #include <process.h> #include <windows.h> #include <string> #include <WCHAR.H> using std::cout; using std::endl; using std::string; int main() { char *str="测试写入文件,HELLO KENNY"; cout<<"写入文件内容:"<<str<<endl; ///------------------------------ ///CreateFile函数创建文件 ///------------------------------ HANDLE hFile=CreateFile("C:\\test.txt", GENERIC_WRITE|GENERIC_READ,//读写权限 0,//独占对设备的访问 NULL,//默认安全设置 CREATE_ALWAYS,//始终创建 FILE_ATTRIBUTE_NORMAL,//正常属性 NULL//空文件模版 ); //注意这里如果调用设置失败返回的是INVALID_HANDLE_VALUE if(hFile==INVALID_HANDLE_VALUE) { cout<<"ERROR:创建文件失败"<<endl; system("PAUSE"); return 1; } ///------------------------------ ///WriteFile函数将字符写入文件 ///------------------------------ //写入文件字节数 DWORD writeByte=0; ////设置文件编码头(Unicode编码)UTF-8:EFBBBF,UTF-16(BE)FEFF,UTF-16(LE):FFFE ////编码BOM参考:http://blog.csdn.net/lipeijs3/article/details/5062243 //WORD UnicodeId =0xFEFF; //WriteFile(hFile,&UnicodeId,sizeof(UnicodeId),&writeByte,NULL); //注意:str是指针,无法字节sizeof获取字符字节数 if(!WriteFile(hFile,str,strlen(str)*sizeof(char),&writeByte,NULL)) { cout<<"ERROR:写入文件失败"<<endl; system("PAUSE"); return 1; } cout<<"成功写入:"<<writeByte<<" byte"<<endl; //将缓冲区内容写入硬盘 FlushFileBuffers(hFile); ///------------------------------ ///GetFileSizeEx函数获得文件大小 ///------------------------------ LARGE_INTEGER lar; if(!GetFileSizeEx(hFile,&lar)) { cout<<"ERROR:读取文件大小失败"<<endl; system("PAUSE"); return 1; } cout<<"FileSize:"<<lar.QuadPart<<" byte"<<endl; ///------------------------------ ///销毁资源 ///------------------------------ CloseHandle(hFile); system("PAUSE"); return 0; }
同步模式下的文件读取
#include <iostream> #include<locale.h> #include <process.h> #include <windows.h> #include <string> #include <WCHAR.H> using std::cout; using std::endl; using std::string; int main() { ///------------------------------ ///CreateFile函数创建文件 ///------------------------------ HANDLE hFile=CreateFile("C:\\test.txt", GENERIC_WRITE|GENERIC_READ,//读写权限 0,//独占对设备的访问 NULL,//默认安全设置 OPEN_ALWAYS,//始终打开 FILE_ATTRIBUTE_NORMAL,//正常属性 NULL//空文件模版 ); //注意这里如果调用设置失败返回的是INVALID_HANDLE_VALUE if(hFile==INVALID_HANDLE_VALUE) { cout<<"ERROR:创建文件失败"<<endl; system("PAUSE"); return 1; } ///------------------------------ ///GetFileSizeEx函数获得文件大小 ///------------------------------ LARGE_INTEGER lar; if(!GetFileSizeEx(hFile,&lar)) { cout<<"ERROR:读取文件大小失败"<<endl; system("PAUSE"); return 1; } cout<<"FileSize:"<<lar.QuadPart<<" byte"<<endl; ///------------------------------ ///SetFilePointer函数设置文件指针 ///------------------------------ //hFile内核对象中有一个(64位偏移量)文件指针,默认设置为0 //可以手动使用SetFilePointerEx函数来设置文件指针 LARGE_INTEGER _dtm={0};//从位置0开始读取 if(!SetFilePointerEx(hFile,_dtm,&_dtm,FILE_CURRENT)) { cout<<"ERROR:设置文件指针失败"<<endl; system("PAUSE"); return 1; } cout<<"文件指针:"<<_dtm.QuadPart<<endl; //读取的字节数 DWORD dwReadSize=0; //读取缓冲区 char *chBuffer=new char[1024]; //将缓冲区元素初始化为0 memset(chBuffer,0,1024); if(!ReadFile(hFile,chBuffer,lar.QuadPart,&dwReadSize,NULL)) { cout<<"ERROR:读取文件失败"<<endl; cout<<"CODE:"<<GetLastError()<<endl; } cout<<"读取字节:"<<dwReadSize<<" byte"<<endl; cout<<chBuffer<<endl; ///------------------------------ ///销毁资源 ///------------------------------ CloseHandle(hFile); delete []chBuffer; system("PAUSE"); return 0; }
这里只是简单的测试API方法,未考虑文件编码格式和大文件的处理,c,c++下的编码处理比NET复杂,所以先把这些细节实现放下,先抓重点,这篇文章是为Windows核心编程中的异步做准备。
本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。