1

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);
    }

そのため、ファイルの同じサイズの異なる部分を複数のスレッドで同時に読み取りたいと考えました。この目的には、マップされたファイルが正しい選択だと思います。他のより高速で可能なアプローチについてのアドバイスは大歓迎です。

私はフォーラムでいくつかの同様の質問を調査しましたが、これが私が見つけた最も近いトピックだと思います: Read all contents of memory maps file or Memory Mapped View Accessor without know the size of it しかし、この回答は C# を使用しており、次を使用して書かれていません。 WinAPI だったので、そのプロセスを理解できませんでした。

前もって感謝します :)

4

1 に答える 1