Как найти конец отображенного в памяти файла на платформе Windows, не зная заранее размер файла? - PullRequest
0 голосов
/ 12 февраля 2020

Я сопоставил файл неизвестного размера (около 4-6 ГиБ) на платформе Windows и получил указатель на начало данных файла, возвращаемых из функции 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, которую я мог найти: Читать все содержимое памяти сопоставленный файл или Access Mapped View Accessor, не зная его размера Но этот ответ использует C# и не написан с использованием WinAPI, поэтому я не мог понять их процесс.

Спасибо в заранее :)

1 Ответ

0 голосов
/ 12 февраля 2020

Позвоните GetFileSizeEx, чтобы получить размер файла, и используйте его в сочетании с базовым адресом и текущим адресом чтения, чтобы определить, где находится конечный адрес.

...