您当前的位置: 首页 >  windows

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

windows linux 的内存映射文件写法

qianbo_insist 发布时间:2021-06-22 21:47:19 ,浏览量:0

show me the code
#include 
#include 

#ifdef _WIN32
#include 
class cmem_map
{
	HANDLE hFile = NULL;
	OFSTRUCT opBuf;
	HANDLE hMapfile = NULL;
	HANDLE hMapview = NULL;
	long offset = 0;
public:
	cmem_map() {}
	~cmem_map() {}

	bool IsOpen()
	{
		return (hMapview != NULL);
	}
	bool IsClosed()
	{
		return (hMapfile == NULL);
	}
	int Open(const wchar_t * memfile_add, int fsize)
	{
		hFile = ::CreateFile(memfile_add, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		if (hFile == 0)
		{
			printf("open file failed!\n");
			return -1;
		}

		//2.为指定文件创建一个有名的文件映象
		hMapfile = CreateFileMapping((HANDLE)hFile, NULL, PAGE_READWRITE, 0, fsize, L"MapTest");
		if (hMapfile == NULL)
		{
			printf("mapping file failed!\n");
			return -1;
		}
		//关闭文件句柄
		CloseHandle((HANDLE)hFile);
		hFile = 0;
		hMapview = MapViewOfFile(hMapfile, FILE_MAP_WRITE, 0, 0, 0);
		if (hMapview == NULL)
		{
			printf("mapping view failed!\n");
			return -1;
		}
		return 0;
	}
	void Close()
	{
		UnmapViewOfFile(hMapview);
		//关闭文件映象句柄
		CloseHandle(hMapfile);
		hMapfile = 0;
	}
	long GetSize()
	{
		return offset;
	}
	int Write(uint8_t * data, int size)
	{
		char *recv = (char *)hMapview;
		recv += offset;
		memcpy(recv, data, size);
		offset += size;
		//把文件映射视图中的修改的内容或全部写回到磁盘文件中
		FlushViewOfFile(recv, size);
		return offset;
		//return 0;
	}
};

#endif  
#ifndef _WIN32
#include    
#include    
#include    



cmem_map::cmem_map() : m_pData(0), m_uSize(0), m_nFile(0)
{
}

cmem_map::~cmem_map()
{
	UnMap();
}

bool cmem_map::Map(const char* szFileName)
{
	UnMap();
	m_nFile = open(szFileName, O_RDONLY);
	if (m_nFile             
关注
打赏
1663161521
查看更多评论
0.0392s