如何在事先不知道文件大小的情况下在 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获取文件大小,结合基地址和当前读取地址判断结束地址。