用Windows的文件映射机制,实现大批量数据的快速存储(3)
=====================================================
#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;
}
- 上一篇:vc中如何使用设备描述表
- 下一篇:Visual C#程序员面试基础问题和答案