【问题标题】:How to CreateFileMapping in C++?如何在 C++ 中创建文件映射?
【发布时间】:2013-11-19 21:25:48
【问题描述】:

我正在编写一个游戏预加载器(一个在启动程序之前将某些文件 [地图] 加载到缓存中的简单程序。有人告诉我使用 CreateFileMapping,但我仍然不确定它是将其加载到物理内存还是虚拟内存中。 .

无论如何,我应该把需要加载的文件放在哪里?

这是我的代码(实际上是其他人在堆栈溢出时告诉我使用它的)

#include <windows.h>
#include <cstdio>

void pf(const char* name) {

HANDLE file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(file == INVALID_HANDLE_VALUE) { printf("couldn't open %s\n", name); return; };

unsigned int len  = GetFileSize(file, 0);

HANDLE mapping  = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, 0);
if(mapping == 0) { printf("couldn't map %s\n", name); return; }

const char* data = (const char*) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);

if(data)
{
    printf("prefetching %s... ", name);

    // need volatile or need to use result - compiler will otherwise optimize out whole loop
    volatile unsigned int touch = 0;

    for(unsigned int i = 0; i < len; i += 4096)
        touch += data[i];
}
else
    printf("couldn't create view of %s\n", name);

UnmapViewOfFile(data);
CloseHandle(mapping);
CloseHandle(file);
}

int main(int argc, const char** argv)
{
if(argc >= 2) for(int i = 1; argv[i]; ++i) pf(argv[i]);
return 0;
}

【问题讨论】:

  • 您展示的代码都不是 C++,因此应该将其标记为 C。
  • @Remy - 他可能正在通过/Tp 开关或*.cpp 源文件名使用C++ 编译器。
  • 文件内容被加载到内存地址为data的RAM中,对应于const char* data行。如果你下一个断点,使用Visual Studio的memory viewer,输入data表示的内存地址,你会看到文件内容的十六进制视图。如果您有 (cygwin) bash shell,您可以通过以下方式看到相同的十六进制视图:od -w32 --endian=big -t x1z /path/to/file.txt

标签: c++ winapi file-mapping


【解决方案1】:

pf 函数接受文件路径作为其参数。触摸循环会导致文件(或文件的至少 4 KB 部分)被加载到物理内存中。

【讨论】:

  • 您好,您能告诉我如何在 void pf 中添加参数吗?我是 C++ 新手
  • 您已经在pf() 上设置了一个参数,您到底想添加什么?
  • 我将添加一个新的整数参数,名为index by:void pf(const char* name,int index)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
相关资源
最近更新 更多