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  }
     
  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4023862.html
Copyright © 2011-2022 走看看