当前位置: 首页 > news >正文

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

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

转载于:https://www.cnblogs.com/lancidie/archive/2011/03/18/1988118.html

相关文章:

  • 关于应用系统的性能优化
  • 嵌入式WEB中CGI调用另外的html
  • Web系统下Office文档的处理 之OpenXML基础
  • C# 事件与委托
  • 细说Linux系统优化-实践篇
  • C# Timer用法
  • 2011年3月四级网络工程师试卷、答案及考点解析
  • ubuntu 9.04下安装NS2
  • SQL Server代理服务无法启动的处理方法(转载)
  • PXE脚本
  • 系统指令
  • 隆文互动营销研究院服务的企业微博再创新高
  • JAVA闭包
  • Dell PowerEdge 服务器操作系统部署速度比同类产品快我们是怎样利用生命周期控制器做到这点的呢?...
  • Reactive Extensions学习
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 08.Android之View事件问题
  • 78. Subsets
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • IndexedDB
  • Java多态
  • Java基本数据类型之Number
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Service Worker
  • unity如何实现一个固定宽度的orthagraphic相机
  • use Google search engine
  • 深度学习在携程攻略社区的应用
  • 学习使用ExpressJS 4.0中的新Router
  • 在Mac OS X上安装 Ruby运行环境
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #define用法
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (2)STL算法之元素计数
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (十)T检验-第一部分
  • (十一)c52学习之旅-动态数码管
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .java 9 找不到符号_java找不到符号
  • .jks文件(JAVA KeyStore)
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net mvc部分视图
  • .NET Standard 的管理策略
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .net分布式压力测试工具(Beetle.DT)
  • []串口通信 零星笔记
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Android]如何调试Native memory crash issue
  • [CDOJ 1343] 卿学姐失恋了
  • [CLR via C#]11. 事件
  • [C语言][PTA基础C基础题目集] strtok 函数的理解与应用
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件
  • [GN] 设计模式——面向对象设计原则概述