zoukankan      html  css  js  c++  java
  • 文件映射的相关操作流程

               当我们需要对大容量文件进行读写的时候,采用CFile类进行读写的话,操作的效率会不高。而且CFile类本身也不是针对大容量文件设计的,所以我们需要提高读写效率的话,需要进行文件映射。
               文件映射是指将需要读写的内容映射到内存中去,然后由系统对内存进行操作,写入到文件中去,从而大大的提高读写的速度。不过,这个还是得要和你的存储设备本身的读写效率相挂钩!例如在SD卡上的读写效率会低于在Flash上。
               关于文件映射的流程主要是:
               1.创建文件对象
           m_hFile      =  CreateFileForMapping  (  strDataFile GENERIC_READ   GENERIC_WRITE  ,
                  FILE_SHARE_WRITE  ,  NULL ,  OPEN_ALWAYS  , FILE_ATTRIBUTE_NORMAL  |                FILE_FLAG_WRITE_THROUGH  ,0);
               2.创建文件映射内存的对象
    m_hMapFile    =  CreateFileMapping  (  m_hFile ,  NULL   PAGE_READWRITE  ,0, 0x1400000,  NULL  );
       在该部分中,需要我们预先制定我们要生成的文件的大小,例如上面的0x1400000,设定文件最大为20M
               3.获取内存映射文件对象的视图
    m_pData       = ( BYTE  *)  MapViewOfFile  ( m_hMapFile  ,  FILE_MAP_WRITE  ,0,0,0x200000);
    在这里我们需要制定每次映射的内存大小,例如我的文件生成是20M,但是我每次映射都映射2M,等到不够的时候,再重新映射一次即可。例如:
                    if  (  m_dataSize  +  nBufLen  >=0x200000)
                {
                        UnmapViewOfFile  (  m_pData );
                        m_dataSize    = 0;
                        m_pData       = ( BYTE  *)  MapViewOfFile  ( m_hMapFile  ,  FILE_MAP_WRITE  ,0,
                              m_fileSize  ,0x200000);
                }
               完成了文件视图获取和内存块的申请之后,我们开始利用该快内存对文件进行读写操作,将内容写到缓存中去。而且,文件指针需要设置偏移量,而这个偏移量就是用来定位文件的结尾处,保证数据读写的无缝连接!
    memcpy  (  m_pData  +  m_dataSize  , buf  ,  nBufLen );
               在每一次映射的内存块使用完之后需要重新映射的时候,或者需要结束文件的读写的时候,我们需要关闭文件映射。
        UnmapViewOfFile  (  m_pData );
               在关闭文件映射之后,如果我们结束了文件的写入操作的时候,我们需要关闭对象句柄,然后就结束了整个文件映射的流程。
            SetFilePointer  (  m_hFile ,  m_fileSize  ,0, FILE_BEGIN  );
                  SetEndOfFile  ( m_hFile  );
                  UnmapViewOfFile  (  m_pData );
                  CloseHandle  ( m_hMapFile  );
                  CloseHandle  ( m_hFile  );
                上面的code中可以看到,我们需要关闭文件句柄,如果我们最后的文件没有达到20M的话,我们需要将多余的部分截断,所以利用SetFilePointer和SetEndOfFile两个函数就可以根据文件的实际大小而截断多余的空闲内存。
  • 相关阅读:
    python基础--选择排序
    python基础--冒泡排序
    python基础----以面向对象的思想编写游戏技能系统
    python基础知识整理
    输入一个整数n,输出该整数中重复的数字,如果没有重复出现的数字则输出no repeat number!
    输入今天以前一个日期,算离今天的天数
    有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完?
    筛选法求素数
    冒泡、选择、插入、二分插入、希尔排序、快排、二分查找、去掉重复值
    n进制转m进制
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3180375.html
Copyright © 2011-2022 走看看