【发布时间】:2017-02-23 08:22:49
【问题描述】:
我有一个非常大的文件,我想使用 CreateFileMapping 和 MapViewOfFile 根据给定的标识符号从中提取 10 个字节的文本。所以这是我徒劳的尝试,
char* Read(char*pFilename, int id)
{
HANDLE hFile = ::CreateFile(pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
GetSystemInfo(&sysInfo);
DWORD dwSysGran = sysInfo.dwAllocationGranularity;
DWORD dwFileMapStart = ((id*10/ dwSysGran)*dwSysGran);
DWORD dwMapViewSize = (id*10 % dwSysGran) + 10;
DWORD dwFileMapSize = id*10 + 10;
char data[10];
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileMapSize, NULL);
if (hMap != NULL)
{
char *rawBuffer = (char*)MapViewOfFile(hMap, FILE_MAP_READ, 0, dwFileMapStart, dwMapViewSize);
memcpy(&data[0], rawBuffer, 10);
UnmapViewOfFile(rawBuffer);
}
//...
return data;
}
例如,如果用户输入一个名为“characterWeaponData.ucc”的文件和an identifier = 122
那么我的程序需要从文件中的第 1220 个字节开始读取 10 个字节的文本并将它们返回以进行进一步处理。
我完全根据我在 SO 上找到的几个资源编写了这段代码,直到现在我对到底是什么一无所知
_In_ DWORD dwFileOffsetHigh,
_In_ DWORD dwFileOffsetLow,
在这两个函数中真正的意思是做。而且我猜我在上面的程序显示中传递给这些的参数是不正确的。
【问题讨论】:
-
当您可以打开文件并寻找您感兴趣的偏移量时,为什么要为此使用内存映射?
-
64 位数字分成两个 32 位值,highest 32 bits 和 lowest 32 bits。
-
但是在这种情况下它们有什么用以及如何使用它们?
-
@molbdnilo 因为我现在只喜欢使用 winapi。
-
您可以使用 Win32 API 从文件中读取数据。