如何在事先不知道文件大小的情况下在 Windows 平台中找到内存映射文件的末尾?
How to find the end of a memory mapped file in Windows platform without previously knowing the size of the file?
我在 Windows 平台上映射了一个大小未知的文件(大约 4-6 GiB),并获得了一个指向从 MapFileView 函数返回的文件数据开头的指针。但是使用指针顺序访问数据时,如何知道已经到达文件末尾呢?
这是我目前编写的代码,它成功映射了文件和 returns 指针:
#include <Windows.h>
#include <stdio.h>
#include <inttypes.h>
int main()
{
HANDLE hFile = CreateFile("Test.bin",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (!hFile)
{
printf("Could not create file (%lu).\n", GetLastError());
exit(1) ;
}
HANDLE hMapFile = CreateFileMappingA(hFile,
NULL,
PAGE_READWRITE,
0,
0,
NULL);
if (!hMapFile)
{
printf("Could not create file mapping object (%lu).\n", GetLastError());
CloseHandle(hFile);
exit(1);
}
int32_t* pBuf = (int32_t*) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
if (!pBuf)
{
printf("Could not map file (%lu).\n", GetLastError());
CloseHandle(hFile);
CloseHandle(hMapFile);
exit(1);
};
UnmapViewOfFile(pBuf);
CloseHandle(hFile);
CloseHandle(hMapFile);
exit(0);
}
所以我想在多个线程中同时读取文件的相同大小的不同部分。我相信映射文件是为此目的的正确选择。非常感谢有关任何其他更快和可能的方法的建议。
我在论坛中研究了一些类似的问题,我想这是我能找到的最接近的主题:
Read all contents of memory mapped file or Memory Mapped View Accessor without knowing the size of it
但是这个答案是用C#写的,不是用WinAPI写的,所以没看懂他们的流程。
提前致谢:)
调用GetFileSizeEx
获取文件大小,结合基地址和当前读取地址判断结束地址。
我在 Windows 平台上映射了一个大小未知的文件(大约 4-6 GiB),并获得了一个指向从 MapFileView 函数返回的文件数据开头的指针。但是使用指针顺序访问数据时,如何知道已经到达文件末尾呢?
这是我目前编写的代码,它成功映射了文件和 returns 指针:
#include <Windows.h>
#include <stdio.h>
#include <inttypes.h>
int main()
{
HANDLE hFile = CreateFile("Test.bin",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (!hFile)
{
printf("Could not create file (%lu).\n", GetLastError());
exit(1) ;
}
HANDLE hMapFile = CreateFileMappingA(hFile,
NULL,
PAGE_READWRITE,
0,
0,
NULL);
if (!hMapFile)
{
printf("Could not create file mapping object (%lu).\n", GetLastError());
CloseHandle(hFile);
exit(1);
}
int32_t* pBuf = (int32_t*) MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
if (!pBuf)
{
printf("Could not map file (%lu).\n", GetLastError());
CloseHandle(hFile);
CloseHandle(hMapFile);
exit(1);
};
UnmapViewOfFile(pBuf);
CloseHandle(hFile);
CloseHandle(hMapFile);
exit(0);
}
所以我想在多个线程中同时读取文件的相同大小的不同部分。我相信映射文件是为此目的的正确选择。非常感谢有关任何其他更快和可能的方法的建议。
我在论坛中研究了一些类似的问题,我想这是我能找到的最接近的主题: Read all contents of memory mapped file or Memory Mapped View Accessor without knowing the size of it 但是这个答案是用C#写的,不是用WinAPI写的,所以没看懂他们的流程。
提前致谢:)
调用GetFileSizeEx
获取文件大小,结合基地址和当前读取地址判断结束地址。