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

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

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
if (mWriteBuffer == NULL) { mWriteBuffer = MapViewOfFile(mMappingHandle, FILE_MAP_WRITE, (DWORD)(mWriteMappingOffset32), (DWORD)(mWriteMappingOffset 0xFFFFFFFF), mMappingViewSize); mWriteBufferOffset =
if (mWriteBuffer == NULL) {
mWriteBuffer = MapViewOfFile(mMappingHandle, FILE_MAP_WRITE, (DWORD)(mWriteMappingOffset>>32), (DWORD)(mWriteMappingOffset & 0xFFFFFFFF), mMappingViewSize);
mWriteBufferOffset = 0;
datacanwrite = mMappingViewSize - mWriteBufferOffset;
if (! mWriteBuffer) {
DumpWindowsErrorMessage();
enstLogService *logservice = enstLogService::GetMyAddr();
logservice->AppendLog(this, "Error when map view of file.");
return false;
}
}
int datatowrite = pDataLength - datawrote;
int actualdatatowrite = (datacanwrite >= datatowrite)?datatowrite:datacanwrite;
memcpy((PBYTE)mWriteBuffer+mWriteBufferOffset, (PBYTE)pData+datawrote, actualdatatowrite);
mWriteBufferOffset += actualdatatowrite;
datawrote += actualdatatowrite;
} while (datawrote < pDataLength);
return true;
}

bool enstFileCache::ReadData(T_INT64 pAddressOffset, T_INT8* pData, int pDataLength)
{
int datareaded = 0;
do {
int datacanread = mReadMappingOffset + mMappingViewSize - pAddressOffset - datareaded;
if (mReadBuffer && (datacanread <= 0 || datacanread > mMappingViewSize)) {
UnmapViewOfFile(mReadBuffer);
mReadBuffer = NULL;
}
if (mReadBuffer == NULL) {
mReadMappingOffset = (pAddressOffset + datareaded) / mMappingViewSize * mMappingViewSize;
mReadBuffer = MapViewOfFile(mMappingHandle, FILE_MAP_READ, (DWORD)(mReadMappingOffset>>32), (DWORD)(mReadMappingOffset & 0xFFFFFFFF), mMappingViewSize);
datacanread = mReadMappingOffset + mMappingViewSize - pAddressOffset - datareaded;
if (! mReadBuffer) {
DumpWindowsErrorMessage();
enstLogService *logservice = enstLogService::GetMyAddr();
logservice->AppendLog(this, "Error when map view of file.");
return false;
}
}
int datatoread = pDataLength - datareaded;
int actualdatatoread = (datacanread >= datatoread)?datatoread:datacanread;
memcpy((PBYTE)pData+datareaded, (PBYTE)mReadBuffer+pAddressOffset-mReadMappingOffset+datareaded, actualdatatoread);
datareaded += actualdatatoread;
} while (datareaded < pDataLength);
return true;
}

void enstFileCache::DumpWindowsErrorMessage()
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );
enstLogService *logservice = enstLogService::GetMyAddr();
logservice->AppendLog(this, (LPTSTR)lpMsgBuf);
//puts((LPTSTR)lpMsgBuf);

LocalFree(lpMsgBuf);
}

#ifdef WIN32
#include "moc_enstfilecache.cpp"
#endif

由于系统是用QT开发的,因此类中使用了不少QT的类,同时也使用了系统中的部分工具类,不过基本工作原理相信你是能够看懂的。另外,整个系统是计划要跨平台使用的,因此今后还需要实现Linux下的类似功能,目前这个版本被绑定在Windows平台上了,不幸。

收藏文章
表情删除后不可恢复,是否删除
取消
确定
图片正在上传,请稍后...
评论内容为空!
还没有评论,快来抢沙发吧!
按钮 内容不能为空!
立刻说两句吧! 查看0条评论
精彩图集

赞助商链接