//XFileMappingReader.h
#ifndef __XFileMappingReader_H__
#define __XFileMappingReader_H__
#include <windows.h>
class CXFileMappingReader
{
public:
CXFileMappingReader(void);
virtual ~CXFileMappingReader(void);
bool open_file_mapping(const wchar_t* lpwszFile);
void close_file_mapping();
bool file_mapping_is_open();
LONGLONG get_file_size();
LPVOID get_file_mapping_base_addr();
private:
HANDLE m_hFile;
HANDLE m_hFileMapping;
bool m_bOpen;
LPVOID m_lpFileMapping_BaseAddr;
LONGLONG m_llFileSize;
};
#endif
//XFileMappingReader.cpp
#include "StdAfx.h"
#include "XFileMappingReader.h"
CXFileMappingReader::CXFileMappingReader(void)
{
m_hFile = NULL;
m_hFileMapping = NULL;
m_bOpen = false;
m_lpFileMapping_BaseAddr = NULL;
m_llFileSize = 0;
}
CXFileMappingReader::~CXFileMappingReader(void)
{
close_file_mapping();
}
bool CXFileMappingReader::open_file_mapping(const wchar_t* lpwszFile)
{
close_file_mapping();
//open file
m_hFile = ::CreateFileW(lpwszFile, GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_READONLY, NULL);
if(INVALID_HANDLE_VALUE == m_hFile)
{
m_hFile = NULL;
return false;
}
DWORD dwFileSizeH, dwFileSizeL = 0;
dwFileSizeL = ::GetFileSize(m_hFile, &dwFileSizeH);
m_llFileSize = dwFileSizeH;
m_llFileSize = m_llFileSize << 32;
m_llFileSize |= dwFileSizeL;
//create file mapping
m_hFileMapping = ::CreateFileMappingW(m_hFile, NULL, PAGE_READONLY, dwFileSizeH, dwFileSizeL, NULL);
if(NULL == m_hFileMapping)
{
::CloseHandle(m_hFile);
m_hFile = NULL;
m_llFileSize = 0;
return false;
}
//map the file
m_lpFileMapping_BaseAddr = MapViewOfFile(m_hFileMapping, FILE_MAP_READ, 0, 0, DWORD(m_llFileSize) );
if(NULL == m_lpFileMapping_BaseAddr)
{
::CloseHandle(m_hFileMapping);
m_hFileMapping = NULL;
::CloseHandle(m_hFile);
m_hFile = NULL;
m_llFileSize = 0;
return false;
}
m_bOpen = true;
return true;
}
void CXFileMappingReader::close_file_mapping()
{
//unmap the file
if(NULL != m_lpFileMapping_BaseAddr)
{
::UnmapViewOfFile(m_lpFileMapping_BaseAddr);
m_lpFileMapping_BaseAddr = 0;
}
//close file mapping
if(NULL != m_hFileMapping)
{
::CloseHandle(m_hFileMapping);
m_hFileMapping = NULL;
}
//close file
if(NULL != m_hFile)
{
::CloseHandle(m_hFile);
m_hFile = NULL;
}
m_bOpen = false;
m_llFileSize = 0;
}
bool CXFileMappingReader::file_mapping_is_open()
{
return m_bOpen;
}
LONGLONG CXFileMappingReader::get_file_size()
{
return m_llFileSize;
}
LPVOID CXFileMappingReader::get_file_mapping_base_addr()
{
return m_lpFileMapping_BaseAddr;
}
//main.cpp
#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;
// #define BOOST_ALL_NO_LIB
// #include <boost/thread.hpp>
// #pragma comment(lib, "boost_thread-vc90-mt-1_48.lib")
#include "XFileMappingReader.h"
int main(int argc, char* argv[])
{
CXFileMappingReader varXFileMappingReader;
varXFileMappingReader.open_file_mapping(L"D:\\123.txt");
if(!varXFileMappingReader.file_mapping_is_open() )
{
return 1;
}
LONGLONG llFileSize = varXFileMappingReader.get_file_size();
char* pszDataAddr = (char*)varXFileMappingReader.get_file_mapping_base_addr();
varXFileMappingReader.close_file_mapping();
return 0;
}