之前介绍的两种逆序存储文件的方法,由于性能问题,只适用于小文件的操作,如果源文件较大,几M,几百M,甚至几G,则需要使用文件内存映射的方式。我对内存映射的原理认识不深,也未做研究,我只知道,使用内存映射将文件映射到内存后,就可以直接通过操作映射的内存块来操作磁盘中的文件,避免了我们主动调用磁盘I/O(I/O过程被操作系统接管),从而提高了文件读写性能。
文件内存映射的过程是:创建文件句柄(CreateFile)->创建文件映射对象句柄(CreateFileMapping)->将文件映射到进程地址空间(MapViewOfFile)->操作->解除映射内存(UnmapViewOfFile)->关闭资源句柄(CloseHandle),实例代码如下(逆序存储):
//FileMapping.h
#pragma once
#include <Windows.h>
#include <tchar.h>
class FileMapping
{
public:
FileMapping();
~FileMapping();
void SetSrcFile(TCHAR* pSrcFile);
void SetDestFile(TCHAR* pDestFile);
bool DoTransfer();
private:
bool InitSrcFileMapping();
bool InitDestFileMapping();
void UninitSrcFileMapping();
void UninitDestFileMapping();
bool ReverseCopy()const;
bool IsEnCharacter(const char* pCh)const
{
if(!pCh) return false;
return !(*pCh & 0x00000080);
}
TCHAR* m_pSrcFile;
TCHAR* m_pDestFile;
bool m_bInitSrc;
HANDLE m_hSrcFile;
HANDLE m_hSrcFileMapping;
char* m_pStartSrcBlock;
DWORD m_dwSrcBlock;
bool m_bInitDest;
HANDLE m_hDestFile;
HANDLE m_hDestFileMapping;
char* m_pStartDestBlock;
};
//FileMapping.cpp
#include "FileMapping.h"
#in