Windows API一日一练(54)WriteFile和ReadFile函数

原创 2007年10月21日 10:09:00
读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载更新的文件下来,然后保存到硬盘。WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。但这两个函数不但可以读取写磁盘的文件,也可以接收和发送网络的数据,还有读写串口、USB、并口等设备的数据。在读写文件里,首先就是先打开文件,然后判断打开是否成功。在写文件时,同时要注意磁盘的空间是否满等问题。在读取文件时,往往需要读取不同位置的文件,比如要读取一个4G的视频文件,就不可能完全把它读取到内存里,因此就需要对文件进行定位读取。
 
函数WriteFileReadFile声明如下:
WINBASEAPI
BOOL
WINAPI
WriteFile(
    __in        HANDLE hFile,
    __in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
    __in        DWORD nNumberOfBytesToWrite,
    __out_opt   LPDWORD lpNumberOfBytesWritten,
    __inout_opt LPOVERLAPPED lpOverlapped
    );
   
WINBASEAPI
BOOL
WINAPI
ReadFile(
    __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  }

 


跟老菜鸟学C++

http://edu.csdn.net/course/detail/2901

版权声明:本文为博主原创文章,未经博主允许不得转载。

串口之ReadFile、WriteFile函数详解

BOOL ReadFile(   HANDLE hFile, //文件的句柄   LPVOID lpBuffer, //用于保存读入数据的一个缓冲区   DWORD nNumberOfByte...
  • wangshubo1989
  • wangshubo1989
  • 2015年08月18日 10:17
  • 13216

C/C++ 文件操作之CreateFile、ReadFile和WriteFile

1. CreateFile  这个函数的功能是创建或者打开一个文件或者I/O设备,通常使用的I/O形式有文件、文件流、目录、物理磁盘、卷、终端流等。如执行成功,则返回文件句柄。 INVALID_HAN...
  • Jeanphorn
  • Jeanphorn
  • 2015年04月10日 17:20
  • 17446

WriteFile与ReadFile

WriteFile函数: 该函数的功能是往文件中写数据,该函数可用来完成同步和异步操作的。写入的位置是由文件指针制定的文字,在完成写操作后,文件的指针会移动到文件新增加的字节的最后(当然这是在文...
  • ccrrt
  • ccrrt
  • 2013年01月15日 14:24
  • 2809

WriteFile

WriteFile目录[隐藏]VB声明 说明 返回值 参数表 注解 VC声明 功能说明: 参数说明 返回值 VB声明说明返回值参数表注解VC声明功能说明:参数说明返回值 [编辑本段]VB声明  De...
  • guchuanlong
  • guchuanlong
  • 2009年12月01日 22:05
  • 743

CreateFile、WriteFile、ReadFile

读写文件每一个软件开发显目必定涉及的工作。CreateFile函数用于创建对应的文件句柄,WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。CreateFile ...
  • Avalon_Y
  • Avalon_Y
  • 2016年05月28日 00:47
  • 4557

Unicode字符集下WriteFile中文处理

最近在使用WriteFile函数时发现,vc2008中unicode字符集下处理中文乱码的一些解决方法,归纳如下 1. 写入的时候采用多字节char类型     HANDLE hFile;   ...
  • whatday
  • whatday
  • 2014年04月20日 11:01
  • 3094

WriteFile和ReadFile函数

读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件...
  • softn
  • softn
  • 2016年06月22日 06:11
  • 1086

C++中WriteFile和ReadFile使用

读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件...
  • virtualdesk
  • virtualdesk
  • 2009年07月25日 17:11
  • 11930

WriteFile()写串口 .

用WriteFile()写串口,用GetLastError()的得到的错误是ERROR_IO_PENDING 请问这是什么错误,我该如何改正?多谢!    2003-8-19 13:50:42 ...
  • slj_win
  • slj_win
  • 2012年08月03日 16:13
  • 17752

WriteFile 函数解析

BOOL WriteFile(   HANDLE hFile, // 文件句柄   LPCVOID lpBuffer, // 数据缓存区指针   DWORD nNumberOfByt...
  • zjhkobe
  • zjhkobe
  • 2012年06月24日 16:03
  • 1054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Windows API一日一练(54)WriteFile和ReadFile函数
举报原因:
原因补充:

(最多只允许输入30个字)