龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

用Windows的文件映射机制,实现大批量数据的快速存储(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
===================================================== #include "enstfilecache.h" #include "../enstsvcpack.h" //#define FILE_CACHE_SIZE 0x40000000 /* = 1GB */ #define FILE_CACHE_SIZE 0x01E00000 /* = 30

=====================================================

#include "enstfilecache.h"

#include "../enstsvcpack.h"

//#define FILE_CACHE_SIZE 0x40000000 /* = 1GB */
#define FILE_CACHE_SIZE 0x01E00000 /* = 30MB */

enstFileCache::enstFileCache()
{
mMappingViewSize = 1024*(64*1024); //window's default block size is 64KB

mFileHandle = INVALID_HANDLE_VALUE;
mMappingHandle = NULL;
mWriteMappingOffset = 0;
mWriteBuffer = NULL;
mWriteBufferOffset = 0;
mReadMappingOffset = 0;
mReadBuffer = NULL;
}

enstFileCache::~enstFileCache()
{
if (mWriteBuffer != NULL) {
UnmapViewOfFile(mWriteBuffer);
}
if (mReadBuffer != NULL) {
UnmapViewOfFile(mReadBuffer);
}
if (mMappingHandle != NULL) {
CloseHandle(mMappingHandle);
}
if (mFileHandle != INVALID_HANDLE_VALUE) {
CloseHandle(mFileHandle);
}
}

bool enstFileCache::CreateFileCache(const QString &pFileName)
{
enstLogService *logservice = enstLogService::GetMyAddr();

mFileHandle = CreateFile(pFileName.toAscii(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (mFileHandle == INVALID_HANDLE_VALUE) {
DumpWindowsErrorMessage();
logservice->AppendLog(this, "Error when create file.");
return false;
}
mMappingHandle = CreateFileMapping(mFileHandle, NULL, PAGE_READWRITE, (DWORD)(FILE_CACHE_SIZE>>32), (DWORD)(FILE_CACHE_SIZE & 0xFFFFFFFF), NULL);
if (mMappingHandle == NULL) {
if (GetLastError() == 112) {
logservice->AppendLog(this, "Looks like it's not enough space on the disk.");
}
DumpWindowsErrorMessage();
logservice->AppendLog(this, "Error when create file mapping.");
return false;
}
mWriteMappingOffset = 0;
mWriteBuffer = NULL;
mWriteBufferOffset = 0;
mReadMappingOffset = 0;
mReadBuffer = NULL;
return true;
}

bool enstFileCache::AppendData(T_INT8* pData, int pDataLength)
{
int datawrote = 0;
do {
int datacanwrite = mMappingViewSize - mWriteBufferOffset;
if (mWriteBuffer && datacanwrite <= 0) {
UnmapViewOfFile(mWriteBuffer);
mWriteBuffer = NULL;
mWriteMappingOffset += mMappingViewSize;
}

精彩图集

赞助商链接