zoukankan      html  css  js  c++  java
  • Windows API一日一练(55)FlushFileBuffers和SetFilePointer函数

    PC硬件体系结构里,速度最快的存储器是CPU里面的寄存器,接着到二级缓存,再到系统RAM内存,最后才到硬盘。因为这种体系结构,就决定了操作系统对文件的操作方式,或者说是最优化的算法。比方操作系统接收到写文件的数据时,就会先把数据保存到RAM里,然后在合适的时间或者合适的数据量时再写到硬盘里。但有时候我们希望数据一定要保存到硬盘里,而不是保存在RAM里,这时就须要使用函数FlushFileBuffers来把RAM里的数据保存到硬盘里。文件的结构是一个有序的队列,有头有尾,当读写文件后,就会移动文件中的文件指针。有时候想移动到特定的位置读取数据。比方读取一个BMP的文件,它有文件头和数据块组成,就须要先读取文件头,然后依据文件头里指示数据块開始位置去读取图片显示数据,这时就须要使用到SetFilePointer函数。
     
     
    函数FlushFileBuffersSetFilePointer声明例如以下:
     
    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  }
     
  • 相关阅读:
    OSG-提示“error reading file e:1.jpg file not handled”
    OSG-加载地球文件报0x00000005错误,提示error reading file simple.earth file not handled
    QT-找开工程后,最上方提示the code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example.
    我的书《Unity3D动作游戏开发实战》出版了
    java中无符号类型的第三方库jOOU
    Windows批处理备份mysql数据
    使用 DevTools 时,通用Mapper经常会出现 class x.x.A cannot be cast to x.x.A
    Java版本,Java版本MongoDB驱动,驱动与MongoDB数据库,Spring之间的兼容性
    Jrebel本地激活方法
    wget下载指定网站目录下的所有内容
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4023862.html
Copyright © 2011-2022 走看看