📄 xfilemap.cpp
字号:
/*/////////////////////////////////////////
// 版权所有(C) 2000-2008 邓辉 //
// Email: denghui0815@hotmail.com //
// 说明: Intel线程优化大赛参赛作品//
/////////////////////////////////////////*/
#ifdef XCODE_WIN
#include <windows.h>
#endif
#ifdef XCODE_LINUX
#include <sys/mman.h> /* for mmap and munmap */
#include <fcntl.h> /* for open */
#include <unistd.h> /* for lseek and write */
#endif
#include <string.h>
#include "XFileMap.h"
// 打开文件映射
XFILEMAPHANDLE XFileMapOpen(const char* szFile, int nMode, unsigned int& nFileSize)
{
XFILEMAPHANDLE hFileMap = XFILEMAPINVALID;
if(szFile != NULL && strlen(szFile) > 0)
{
#ifdef XCODE_WIN
HANDLE hFile = NULL;
if(nMode == XFILEMAP_READONLY)
{
// 使用内存映射打开文件
hFile = CreateFile(szFile,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hFile != NULL)
{
hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY, 0, 0 , NULL);
// 获取文件大小
DWORD nFileSizeH;
nFileSize = GetFileSize(hFile, &nFileSizeH);
}
}
else if(nMode == XFILEMAP_WRITE)
{
// 使用内存映射打开文件
hFile = CreateFile(szFile,
GENERIC_WRITE | GENERIC_READ,
0,
NULL,
CREATE_ALWAYS,
FILE_FLAG_RANDOM_ACCESS | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if(hFile != NULL)
{
hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, nFileSize, NULL);
}
}
if(hFile != NULL) CloseHandle(hFile);
#endif
#ifdef XCODE_LINUX
if(nMode == XFILEMAP_READONLY)
{
struct stat buf ={0};
if(stat(szFile, &buf) == 0)
{
nFileSize = buf.st_size;
hFileMap = open(szFile, O_RDONLY, S_IRUSR | S_IWUSR);
}
}
else if(nMode == XFILEMAP_WRITE)
{
hFileMap = open(szFile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
if(hFileMap != XFILEMAPINVALID)
{
lseek(hFileMap, nFileSize - 1, SEEK_SET);
write(hFileMap, "\0", 1);
lseek(hFileMap, 0, SEEK_SET);
}
}
#endif
}
return hFileMap;
}
// 关闭文件映射
void XFileMapClose(XFILEMAPHANDLE* pFileMap)
{
if(pFileMap != NULL && *pFileMap != XFILEMAPINVALID)
{
#ifdef XCODE_WIN
CloseHandle(*pFileMap);
#endif
#ifdef XCODE_LINUX
close(*pFileMap);
#endif
*pFileMap = XFILEMAPINVALID;
}
}
// 文件映射
void* XFileMapView(XFILEMAPHANDLE hFileMap, int nMode, unsigned int nMapOff, unsigned int nMapSize)
{
void* pMemory = XMAPMEMINVALID;
#ifdef XCODE_WIN
if(nMode == XFILEMAP_READONLY)
{
pMemory = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, nMapOff, nMapSize);
}
else if(nMode == XFILEMAP_WRITE)
{
pMemory = MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, nMapOff, nMapSize);
}
#endif
#ifdef XCODE_LINUX
if(nMode == XFILEMAP_READONLY)
{
pMemory = mmap(NULL, nMapSize, PROT_READ, MAP_PRIVATE, hFileMap, nMapOff);
}
else if(nMode == XFILEMAP_WRITE)
{
pMemory = mmap(NULL, nMapSize, PROT_WRITE, MAP_SHARED, hFileMap, nMapOff);
}
#endif
return pMemory;
}
// 解除映射
void XFileMapUnView(void* pMemory, unsigned int nMapSize)
{
#ifdef XCODE_WIN
UnmapViewOfFile(pMemory);
#endif
#ifdef XCODE_LINUX
munmap(pMemory, nMapSize);
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -