如何获取文件的地图视图只有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?的主要内容,如果未能解决你的问题,请参考以下文章