C++ CreateFileMapping 內(nèi)存映射實(shí)現(xiàn)快速讀取文件

c++
小億
145
2024-01-09 08:58:23

在C++中,可以使用CreateFileMapping函數(shù)來(lái)創(chuàng)建一個(gè)文件映射對(duì)象,以便將文件映射到進(jìn)程的虛擬地址空間中。然后,可以使用MapViewOfFile函數(shù)將文件映射到內(nèi)存中,從而實(shí)現(xiàn)快速讀取文件的操作。

以下是一個(gè)示例代碼,演示了如何使用內(nèi)存映射來(lái)快速讀取文件:

#include <iostream>
#include <Windows.h>

int main() {
    HANDLE hFile = CreateFile(L"example.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cout << "Failed to open file." << std::endl;
        return 1;
    }

    HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    if (hMapFile == NULL) {
        std::cout << "Failed to create file mapping." << std::endl;
        CloseHandle(hFile);
        return 1;
    }

    LPVOID pData = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
    if (pData == NULL) {
        std::cout << "Failed to map view of file." << std::endl;
        CloseHandle(hMapFile);
        CloseHandle(hFile);
        return 1;
    }

    // 讀取文件內(nèi)容
    char* pFileData = static_cast<char*>(pData);
    std::cout << "File content: " << pFileData << std::endl;

    UnmapViewOfFile(pData);
    CloseHandle(hMapFile);
    CloseHandle(hFile);

    return 0;
}

在上面的示例中,首先使用CreateFile函數(shù)打開(kāi)文件example.txt,然后使用CreateFileMapping函數(shù)創(chuàng)建一個(gè)文件映射對(duì)象hMapFile。接下來(lái),使用MapViewOfFile函數(shù)將文件映射到內(nèi)存中,并返回一個(gè)指向文件內(nèi)容的指針pData。最后,通過(guò)將pData強(qiáng)轉(zhuǎn)為char*類(lèi)型,可以訪問(wèn)文件的內(nèi)容并進(jìn)行處理。

需要注意的是,在使用完文件映射后,需要調(diào)用UnmapViewOfFile函數(shù)和CloseHandle函數(shù)來(lái)釋放資源。

以上就是使用C++的CreateFileMapping函數(shù)實(shí)現(xiàn)快速讀取文件的方法。當(dāng)文件較大時(shí),內(nèi)存映射可以提供更高效的讀取性能。

0