Windows API一日一练(54)WriteFile和ReadFile函数 读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载更新的文件下来,然后保存到硬盘。WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。但这两个函数不但可以读取写磁盘的文件,也可以接收和发送网络的数据,还有读写串口、USB、并口等设备的数据。在读写文件里,首先就是先打开文件,然后判断打开是否成功。在写文件时,同时要注意磁盘的空间是否满等问题。在读取文件时,往往需要读取不同位置的文件,比如要读取一个4G的视频文件,就不可能完全把它读取到内存里,因此就需要对文件进行定位读取。 函数WriteFile和ReadFile声明如下:WINBASEAPIBOOLWINAPIWriteFile( __in HANDLE hFile, __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer, __in DWORD nNumberOfBytesToWrite, __out_opt LPDWORD lpNumberOfBytesWritten, __inout_opt LPOVERLAPPED lpOverlapped ); WINBASEAPIBOOLWINAPIReadFile( __in HANDLE hFile, __out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer, __in DWORD nNumberOfBytesToRead, __out_opt LPDWORD lpNumberOfBytesRead, __inout_opt LPOVERLAPPED lpOverlapped ); hFile是文件句柄。lpBuffer是读写数据缓冲区。nNumberOfBytesToWrite是多少数据要写入。lpNumberOfBytesWritten是已经写入多少数据。nNumberOfBytesToRead是多少数据要读取。nNumberOfBytesToRead是已经读取多少数据。lpOverlapped是异步读写的结构。 调用函数的例子如下:#001 //创建、写入、读取文件。#002 //蔡军生 2007/10/21 QQ:9073204 深圳#003 void CreateFileDemo(void)#004 {#005 //#006 HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"), //创建文件的名称。#007 GENERIC_WRITE|GENERIC_READ, // 写和读文件。#008 0, // 不共享读写。#009 NULL, // 缺省安全属性。#010 CREATE_ALWAYS, // 如果文件存在,也创建。#011 FILE_ATTRIBUTE_NORMAL, // 一般的文件。 #012 NULL); // 模板文件为空。#013 #014 if (hFile == INVALID_HANDLE_VALUE) #015 { #016 //#017 OutputDebugString(_T("CreateFile fail!/r/n"));#018 }#019 #020 //往文件里写数据。#021 const int BUFSIZE = 4096;#022 char chBuffer[BUFSIZE]; #023 memcpy(chBuffer,"Test",4);#024 DWORD dwWritenSize = 0;#025 BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);#026 if (bRet)#027 {#028 //#029 OutputDebugString(_T("WriteFile 写文件成功/r/n"));#030 }#031 #032 //先把写文件缓冲区的数据强制写入磁盘。#033 FlushFileBuffers(hFile);#034 #035 //#036 //从文件里读取数据。#037 LONG lDistance = 0;#038 DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);#039 if (dwPtr == INVALID_SET_FILE_POINTER)#040 { #041 //获取出错码。#042 DWORD dwError = GetLastError() ; #043 //处理出错。 #044 }#045 #046 DWORD dwReadSize = 0;#047 bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);#048 if (bRet)#049 {#050 //#051 OutputDebugString(_T("ReadFile 读文件成功/r/n"));#052 }#053 else#054 {#055 //获取出错码。#056 DWORD dwError = GetLastError(); #057 //处理出错。 #058 TCHAR chErrorBuf[1024];#059 wsprintf(chErrorBuf,_T("GetLastError()=%d/r/n"),dwError);#060 OutputDebugString(chErrorBuf);#061 }#062 #063 }
转载请注明原文地址: https://ibbs.8miu.com/read-1150314.html