blog

枪手亨利

博客园 首页 新随笔 联系 订阅 管理
      想用内存映射文件加、解密大文件,但是对这个内存映射文件实在了解的不多,请指教!原来采用的方法是每次从原文件中读出固定字节的数据,加密,把加密后的数据写入到新建的文件中(也就是加密后的文件),现在改用内存映射文件不知道怎么做,是不是也应该一块一块地加密文件呀?可怎样把文件的一部份读出来?怎样控制读出的位置?操作方式和一般的文件读、写有什么区别吗?

      只知道开始用这两个函数:
      HANDLE hFile = CreateFile(oldfile, GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
      HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwFileSize + sizeof(WCHAR),NULL);
      char * lpMapAddress;
      lpMapAddress = (char *)MapViewOfFile(hMapFile, // Handle to mapping object.       
            FILE_MAP_ALL_ACCESS,// Read/write permission 
            0, // Max. object size. 
            0, // Size of hFile. 
            0);

      用指针lpMapAddress处理文件数据,比如char ch=*lpMapAddress就从文件中读取一个字节,*lpMapAddress=ch相当于写入一个字节。FlushViewOfFile可以真正写入数据到文件。
      根据msdn的说法,file mapping是可以提高文件读写的速度。调用MapViewOfFile之后,可以看作是,虚拟内存从lpMapAddress地址开始的,大小等于dwFileSize的一个连续的内存空间的内容,和文件的内容一一对应,比如,从(lpMapAddress+368)对应文件的第368字节的数据,char ch=*(lpMapAddress+368)相当于读取第368字节到ch中,而*(lpMapAddress+368)=3相当于把3写到文件的第368字节中。所以另外一个好处是,你可以直接操作内存来读写文件,不需要分配额外的缓冲区来保存从文件中读取的内容,也不需要额外的写操作把缓冲区写入文件。

      加密可以这样:比如需要从文件第192字节开始,加密100个8字节数据:
假设对内存数据加密函数c把内存pData中的数据加密后,写入pData:
      __int64 * pData=(__int64 *)(lpMapAddress+192);
      int i;
      for(i=0;i<100;i++)
      {
             c(pData);
             pData++;
      }
   这样,虽然是内存操作,文件相应内容也会同时改变。
posted on 2005-11-05 09:46  henry  阅读(778)  评论(0编辑  收藏  举报