如何获取文件的地图视图只有ifstream?

Posted

技术标签:

【中文标题】如何获取文件的地图视图只有ifstream?【英文标题】:How to get map view of file just have only ifstream? 【发布时间】:2014-09-04 16:38:56 【问题描述】:

我需要为我的 ifstream 创建文件映射并获取文件的映射视图。

HANDLE hFile = CreateFile(fileName, GENERIC_READ, FILE_SHARE_READ, 
    NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);  
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, 0);
    if (hFileMap != NULL) 
    
        BYTE *pData = (BYTE *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, dwFileSize); 
        if (pData != NULL)  
        
            fillDllInfo(pData, dwFileSize);
            UnmapViewOfFile(pData);         
                       

我在这里创建文件,等等。但我需要做这样的事情

std::ifstream pefile;
pefile.open(this->fileName, std::ios::in | std::ios::binary);
if(!pefile.is_open())   
    return error(erId::Cant_Open_File);
    std::streamoff filesize = pefile.tellg();
    //HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, 0);
    //if (hFileMap != NULL) 
    //
    //  BYTE *pData = (BYTE *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, dwFileSize); 
    //  if (pData != NULL)  
        //
            fillDllInfo(pData /* ??? */, filesize );
        //  UnmapViewOfFile(pData);         
        //     

和我的 pefile 一起工作!我怎样才能在没有提升或其他任何东西的情况下在我的 pefile 上获取 pData? 谢谢!

【问题讨论】:

没有可移植的方式来映射内存中的文件。您必须使用 Windows API。你的第一个代码有什么问题? 我需要创建跨平台应用。没什么,它正在工作。 :) 所以我还是需要使用 boost 吗? :( 你知道PE文件只能在windows上工作,对吧? 是的。:) 但是PE文件可以存在于其他系统中。 【参考方案1】:

您可以将所有文件加载到缓冲区中,而不是将文件映射到内存中。它的效率要低得多,但它是可移植的。

#include <string>
#include <fstream>
#include <cstring> // memcpy

void fillDllInfo (char* buf, size_t size)

  // ...


char* read_whole_stream (std::ifstream& stream, size_t& size)

  std::istreambuf_iterator<char> eos;
  std::string s (std::istreambuf_iterator<char>(stream), eos);
  char* buf = new char[s.size()];
  memcpy(buf, s.c_str(), s.size());
  return buf;


int main ()

  std::ifstream pefile;
  pefile.open("in", std::ios::in | std::ios::binary);

  if (!pefile.is_open())
    return 1;

  size_t filesize;
  char* pData = read_whole_stream(pefile, filesize);
  fillDllInfo(pData, filesize);
  delete[] pData;

  return 0;

【讨论】:

以上是关于如何获取文件的地图视图只有ifstream?的主要内容,如果未能解决你的问题,请参考以下文章

ifstream 打开失败时如何获取错误消息

如何从谷歌地图标记中获取视图?

谷歌地图视图如何在地图缩放时获取原始点或框进行注释?

如何在谷歌地图上获取图像视图坐标(位置/纬度)

在列表视图中滚动地图时如何避免滚动列表视图

ifstream:如何判断指定文件是不是不存在