在 PC 硬件体系结构里,速度最快的存储器是 CPU 里面的寄存器,接着到二级缓存,再到系统 RAM 内存,最后才到硬盘。由于这样的体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法。比如操作系统接收到写文件的数据时,就会先把数据保存到 RAM 里,然后在合适的时间或者合适的数据量时再写到硬盘里。但有时候我们希望数据一定要保存到硬盘里,而不是保存在 RAM 里,这时就需要使用函数 FlushFileBuffers 来把 RAM 里的数据保存到硬盘里。文件的结构是一个有序的队列,有头有尾,当读写文件后,就会移动文件里的文件指针。有时候想移动到特定的位置读取数据。比如读取一个 BMP 的文件,它有文件头和数据块组成,就需要先读取文件头,然后根据文件头里指示数据块开始位置去读取图片显示数据,这时就需要使用到 SetFilePointer 函数。
函数 FlushFileBuffers 和 SetFilePointer 声明如下:
WINBASEAPI
BOOL
WINAPI
FlushFileBuffers(
    __in HANDLE hFile
    );
   
WINBASEAPI
DWORD
WINAPI
SetFilePointer(
   __in     HANDLE hFile,
    __in     LONG lDistanceToMove,
    __in_opt PLONG lpDistanceToMoveHigh,
    __in     DWORD dwMoveMethod
    );
hFile 是文件句柄。
lDistanceToMove 是文件指针距离头或尾的长度。
lpDistanceToMoveHigh 是文件指针距离头或尾的长度高位长度。
dwMoveMethod 是相对文件头、文件尾或者当前位置的方式。
调用函数的例子如下:
#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/ajuanabc/archive/2007/10/22/2464251.html

Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数相关推荐

  1. Windows API一日一练 55 FlushFileBuffers和SetFilePointer函数

    在 PC 硬件体系结构里,速度最快的存储器是 CPU 里面的寄存器,接着到二级缓存,再到系统 RAM 内存,最后才到硬盘.由于这样的体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法.比 ...

  2. Windows API一日一练(56)SetEndOfFile和GetFileSizeEx函数

    有一天,我正在开发BT软件,它有这样的一个功能,就是先把文件的大小分配好,然后再慢慢地往里面对应的位置写入相应的数据.这样的好处,就是可以先把磁盘空间占用起来,以便后面的下载顺利进行.要实现这个功能, ...

  3. Windows API一日一练(20)LoadIcon和LoadCursor函数-程序图标设置和鼠标的样式

    主目录传送门 https://blog.csdn.net/zb774095236/article/details/108291755 本次学习的源码模板下载: 1.百度云:https://pan.ba ...

  4. Windows API一日一练 59 CreateFileMapping和MapViewOfFile函数

    在开发软件过程里,也经常碰到进程间共享数据的需求.比如 A 进程创建计算数据, B 进程进行显示数据的图形.这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开 ...

  5. Windows API一日一练(59)CreateFileMapping和MapViewOfFile函数

    在开发软件过程里,也经常碰到进程间共享数据的需求.比如 A 进程创建计算数据, B 进程进行显示数据的图形.这样的开发方式可以把一个大程序分开成独立的小程序,提高软件的成功率,也可以更加适合团队一起开 ...

  6. Windows API一日一练(10-12)GetMessage TranslateMessage DispatchMessage函数

    主目录传送门 https://blog.csdn.net/zb774095236/article/details/108291755 本次学习的源码模板下载: 1.https://pan.baidu. ...

  7. Windows API一日一练(29)SelectObject和DeleteObject函数

    Windows 显示设备的属性,共有下面几种:位图.画刷.字体.画笔.区域.如果要设置它们到当前设备里,就需要使用 SelectObject 函数,比如上面介绍的字体设置,就会用到这个函数.当你创建一 ...

  8. Windows API一日一练 29 SelectObject和DeleteObject函数

    Windows 显示设备的属性,共有下面几种:位图.画刷.字体.画笔.区域.如果要设置它们到当前设备里,就需要使用 SelectObject 函数,比如上面介绍的字体设置,就会用到这个函数.当你创建一 ...

  9. Windows API一日一练(70)GetSystemTime和GetLocalTime函数

    时间是一个非常重要的信息,比如写LOG时,就需要把时间输出来,跟踪程序是什么时候出错的.或者当你开发一个银行交易系统时,就要记录当前交易的时间,以便后面可以输出报表,打印给信用卡用户.根据不同的需求, ...

最新文章

  1. 关于acm的新手一些问题
  2. mysql中 group_concat长度限制
  3. py文件控制台执行时,报错:引入的模块不存在
  4. 《移动项目实践》实验报告——Android网络通信
  5. Linux下编写选择排序(C语言)
  6. mac sudo免密码
  7. python基础----python的使用(四)
  8. 手机号脱敏处理_C#简单代码实现对手机号邮箱等隐私信息进行*号打码
  9. dos下清除登录共享用户名和密码
  10. 这6个地方不去简直太可惜!
  11. Visual Studio调试之断点基础篇
  12. 如何下载linux历史版本下载,CentOS历史版本下载方法
  13. 《Reids 设计与实现》第三章 跳跃表
  14. python文件写入乱码_python写文件打开后是乱码
  15. 【操作系统】第一章.操作系统引论思维导图
  16. 牛逼神器第三弹--nth_element函数
  17. html的根标签是什么,html标签
  18. 安卓眼球追踪_研究者开发AI眼球追踪系统 智能手机都能用
  19. 台式计算机键盘灯打开方式,台式机开机黑屏但键盘指示灯亮的解决方法
  20. ios自己搭建服务器证书,iOS一步一步实现Https自建证书校验

热门文章

  1. fastadmin中使用phpExcel导出表格数据到excel中
  2. iPhone 13发布会,苹果不想让你知道的三个细节
  3. Windows命令-目录操作-显示目录中文件和子目录-dir
  4. 好用!!Google 的照片管理软件-- Picasa
  5. 利用计算机进行绘制建筑工程图纸,工匠日志|园林创意表现:建筑施工图的计算机表达...
  6. 小米手机如何限制不显示通知和乱下载软件
  7. RecyclerView的Recycler
  8. redis解决商品秒杀问题
  9. SAP应用小技巧:利用界面颜色设定区分不同系统
  10. Android 8.1 FreeForm切换显示异常