📄 mapfile.hpp
字号:
#ifndef _MAPFILE_HPP_#define _MAPFILE_HPP_#ifdef HAVE_CONFIG_H# include "config.h"#endif#ifdef HAVE_MMAP# include <sys/types.h># include <fcntl.h># include <sys/mman.h>#endif#ifdef _WIN32# include <windows.h>#endif#include <glib.h>class MapFile {public: MapFile(void) : data(NULL),#ifdef HAVE_MMAP mmap_fd(-1)#elif defined(_WIN32) hFile(0), hFileMap(0)#endif { } ~MapFile(); bool open(const char *file_name, unsigned long file_size); inline gchar *begin(void) { return data; }private: char *data; unsigned long size;#ifdef HAVE_MMAP int mmap_fd;#elif defined(_WIN32) HANDLE hFile; HANDLE hFileMap;#endif};inline bool MapFile::open(const char *file_name, unsigned long file_size){ size=file_size;#ifdef HAVE_MMAP if ((mmap_fd = ::open(file_name, O_RDONLY)) < 0) { //g_print("Open file %s failed!\n",fullfilename); return false; } data = (gchar *)mmap( NULL, file_size, PROT_READ, MAP_SHARED, mmap_fd, 0); if ((void *)data == (void *)(-1)) { //g_print("mmap file %s failed!\n",idxfilename); data=NULL; return false; }#elif defined( _WIN32) hFile = CreateFile(file_name, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, file_size, NULL); data = (gchar *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, file_size);#else gsize read_len; if (!g_file_get_contents(file_name, &data, &read_len, NULL)) return false; if (read_len!=file_size) return false; #endif return true;}inline MapFile::~MapFile(){ if (!data) return;#ifdef HAVE_MMAP munmap(data, size); close(mmap_fd);#else# ifdef _WIN32 UnmapViewOfFile(data); CloseHandle(hFileMap); CloseHandle(hFile);# else g_free(data);# endif#endif }#endif//!_MAPFILE_HPP_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -