簡體   English   中英

如何在不知道文件大小的情況下在 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 函數返回的文件數據開頭的指針。 但是當我使用指針順序訪問數據時,我怎么知道我已經到達文件的末尾呢?

這是我到目前為止編寫的代碼,它成功映射文件並返回指針:

    #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獲取文件的大小,並結合基地址和當前讀取地址來確定結束地址在哪里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM