C 如何在Windows平台中查找内存映射文件的结尾,而事先不知道文件的大小?

C 如何在Windows平台中查找内存映射文件的结尾,而事先不知道文件的大小?,c,windows,winapi,virtual-memory,file-mapping,C,Windows,Winapi,Virtual Memory,File Mapping,我在Windows平台上映射了一个大小未知的文件,大约为4-6 GiB,并获得了一个指向MapFileView函数返回的文件数据开头的指针。但是,当我按顺序使用指针访问数据时,我如何知道我已经到达了文件的末尾 以下是我迄今为止编写的代码,它成功地映射了文件并返回指针: #include <Windows.h> #include <stdio.h> #include <inttypes.h> int main() {

我在Windows平台上映射了一个大小未知的文件,大约为4-6 GiB,并获得了一个指向MapFileView函数返回的文件数据开头的指针。但是,当我按顺序使用指针访问数据时,我如何知道我已经到达了文件的末尾

以下是我迄今为止编写的代码,它成功地映射了文件并返回指针:

    #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);
    }
所以我想在多个线程中同时读取文件中大小相同的不同部分。我相信映射文件是用于此目的的正确选择。对于任何其他更快和可能的方法,我们都非常感谢

我在论坛上研究了一些类似的问题,我想这是我能找到的最接近的话题: 但是这个答案是用C编写的,不是用WinAPI编写的,因此,我无法理解他们的过程


提前感谢:

调用GetFileSizeEx获取文件大小,并将其与基址和当前读取地址结合使用,以确定结束地址的位置。

调用GetFileSizeEx获取文件大小。同时读取文件的不同部分要比顺序读取慢。为什么不使用函数获取文件大小?您还可以使用该函数获取映射视图的大小。我假设如果文件太大,MapViewOfFile将失败。你检查过你可以映射完整的文件了吗?谢谢@DavidHeffernan。但是有没有办法不知道大小就知道结局呢?此外,您能帮助我理解为什么即使使用内存映射文件,同步读取也会变慢吗?@chmike感谢您的回复。我不会在单个视图中映射整个文件,而是计划为每个线程创建500个MiB的视图,我想这应该可以。我理解得对吗?我当然可以使用文件大小,你是对的。但我很好奇,是否可以在不知道尺寸的情况下完成。文件是否有一个结束标记来指示它的结束位置?您认为文件系统如何知道文件指针已到达文件的结尾?它知道这一点,因为它知道大小。当然,如果它是一个旋转的磁盘,那么按顺序读取会更快。我不确定SSD是否一定有支持并行访问的总线体系结构,也不确定系统是否可以利用它们。让我们扭转这个局面,为什么你认为并行访问会更快?谢谢你的回答。我猜fread/fgetc是如何知道它已经到达了文件的末尾的,与此类似,然后返回EOF定义宏以方便用户。是吗?@roh:不,不一样。fread/fgetc不使用文件映射对象。@IInspectable是的,我知道。对不起,我的意思是没有文件映射对象。我的意思是它获取文件大小,读取文件并比较读取数据的大小。可能是类似的东西。@roh:fread/fgetc可能只是调用了,并有了那个API报告EOF。然而,我并不知道这是如何实现的。