在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#include 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函数取消文件映射,并关闭文件映射对象和文件句柄。