在Windows中,可以使用CreateFileMapping函數來創建文件映射。
CreateFileMapping函數的原型如下:
HANDLE CreateFileMapping(
HANDLE hFile,
LPSECURITY_ATTRIBUTES lpAttributes,
DWORD flProtect,
DWORD dwMaximumSizeHigh,
DWORD dwMaximumSizeLow,
LPCTSTR lpName
);
參數說明:
hFile: 要映射到文件的句柄。可以是一個已經打開的文件句柄,也可以是INVALID_HANDLE_VALUE,表示創建一個新的文件映射。
lpAttributes: 指向SECURITY_ATTRIBUTES結構體的指針,用于控制文件映射對象的安全性。可以傳入NULL。
flProtect: 指定內存映射對象的訪問保護屬性。可以使用PAGE_READONLY、PAGE_READWRITE等常量。
dwMaximumSizeHigh: 文件映射對象的最大尺寸的高位DWORD值。一般為0。
dwMaximumSizeLow: 文件映射對象的最大尺寸的低位DWORD值。可以指定文件大小,也可以為0表示映射整個文件。
lpName: 文件映射對象的名稱。可以傳入NULL。
CreateFileMapping函數的返回值是一個表示文件映射對象的句柄。可以使用這個句柄來訪問和操作文件映射。
創建文件映射對象后,可以使用MapViewOfFile函數將文件映射到進程的地址空間中,然后就可以通過訪問這塊內存來讀寫文件內容。
示例代碼如下:
#include <windows.h>
#include <iostream>
int main() {
HANDLE hFile = CreateFile(
"test.txt",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
std::cout << "Failed to open file." << std::endl;
return 1;
}
HANDLE hMapping = CreateFileMapping(
hFile,
NULL,
PAGE_READWRITE,
0,
0,
NULL
);
if (hMapping == NULL) {
std::cout << "Failed to create file mapping." << std::endl;
CloseHandle(hFile);
return 1;
}
LPVOID lpBaseAddress = MapViewOfFile(
hMapping,
FILE_MAP_ALL_ACCESS,
0,
0,
);
if (lpBaseAddress == NULL) {
std::cout << "Failed to map view of file." << std::endl;
CloseHandle(hMapping);
CloseHandle(hFile);
return 1;
}
// 在這里可以通過訪問lpBaseAddress指向的內存來讀寫文件內容
UnmapViewOfFile(lpBaseAddress);
CloseHandle(hMapping);
CloseHandle(hFile);
return 0;
}
以上示例代碼創建了一個文件句柄hFile,并將其映射到文件映射對象hMapping中。然后使用MapViewOfFile函數將文件映射到進程的地址空間中,返回一個指向映射后內存的指針lpBaseAddress。通過訪問lpBaseAddress指向的內存,可以讀寫文件內容。最后需要使用UnmapViewOfFile函數取消文件映射,并關閉文件映射對象和文件句柄。