BoostMappingFile.hpp

source: wtcpp/folder98/folder02/folder1/file04.md

/*!
 * \file BoostMappingFile.hpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief boost的内存映射文件组件的封装,方便使用
 */
#pragma once
#include <boost/filesystem.hpp>
#include <boost/interprocess/file_mapping.hpp>
#include <boost/interprocess/mapped_region.hpp>

// 将文件的内容映射到进程的地址空间
class BoostMappingFile
{
public:
	BoostMappingFile()
	{
		_file_map=NULL;
		_map_region=NULL;
	}

	~BoostMappingFile()
	{
		close();
	}
	// 关闭文件指针
	void close()
	{
		if(_map_region!=NULL)
			delete _map_region;

		if(_file_map!=NULL)
			delete _file_map;

		_file_map=NULL;
		_map_region=NULL;
	}

	void sync()
	{
		if(_map_region)
			_map_region->flush();
	}

	void *addr()
	{
		if(_map_region)
			return _map_region->get_address();
		return NULL;
	}

	size_t size()
	{
		if(_map_region)
			return _map_region->get_size();
		return 0;
	}

	bool map(const char *filename,
		int mode=boost::interprocess::read_write,
		int mapmode=boost::interprocess::read_write,bool zeroother=true)
	{
		if (!boost::filesystem::exists(filename))
		{
			return false;
		}
		_file_name = filename;

		_file_map = new boost::interprocess::file_mapping(filename,(boost::interprocess::mode_t)mode);
		if(_file_map==NULL)
			return false;

		_map_region = new boost::interprocess::mapped_region(*_file_map,(boost::interprocess::mode_t)mapmode);
		if(_map_region==NULL)
		{
			delete _file_map;
			return false;
		}

		return true;
	}

	const char* filename()
	{
		return _file_name.c_str();
	}

	bool valid() const
	{
		return _file_map != NULL;
	}

private:
	std::string _file_name;								// 文件名称
	boost::interprocess::file_mapping *_file_map;
	boost::interprocess::mapped_region *_map_region;
};