该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
BOOL CMyMiniDataBase::InitializeSelecet(READDATA *lpReadData)
{
EnterCriticalSection(&cs);
ZeroMemory(lpReadData,sizeof(READDATA));
DWORD dwFileSize = GetFileSize(hFile,NULL);
try
{
if(dwFileSize == NULL)
throw 1;
//得到数据库有多少记录.
lpReadData->dwCountRecord = dwFileSize/sizeof(COUNTINFORMATION);
lpReadData->hFileMappingObject=CreateFileMapping(hFile,
NULL,PAGE_READWRITE,0,dwFileSize,NULL);
if(lpReadData->hFileMappingObject == NULL)
throw 1;
lpReadData->pAddress=MapViewOfFile(lpReadData->hFileMappingObject,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
if(lpReadData->pAddress==NULL)
throw 1;
}
catch(...)
{
LeaveCriticalSection(&cs);
return FALSE;
}
LeaveCriticalSection(&cs);
return TRUE;
}
BOOL CMyMiniDataBase::ReadFirstData(READDATA *lpReadData)
{
return InitializeSelecet(lpReadData);
}
BOOL CMyMiniDataBase::ReadNextData(LPCOUNTINFORMATION cfm,READDATA *lpReadData)
{
if(lpReadData->dwIndex >= lpReadData->dwCountRecord)
return FALSE;
CHAR *szBytePoint = (CHAR *)lpReadData->pAddress;
szBytePoint+=lpReadData->dwIndex*sizeof(COUNTINFORMATION);
CopyMemory(cfm,szBytePoint,sizeof(COUNTINFORMATION));
lpReadData->dwIndex++;
return TRUE;
}
BOOL CMyMiniDataBase::CloseReadData(READDATA *lpReadData)
{
if(lpReadData->hFileMappingObject != NULL)
CloseHandle(lpReadData->hFileMappingObject);
if(lpReadData->pAddress!=NULL)
UnmapViewOfFile(lpReadData->pAddress);
return TRUE;
}
BOOL CMyMiniDataBase::DeleteData(LPCOUNTINFORMATION cfm)
{
EnterCriticalSection(&cs);
BOOL bResult = FALSE;
DWORD nFileSize = GetFileSize(hFile,NULL);
if(nFileSize == NULL)
{
LeaveCriticalSection(&cs);
return bResult;
}
HANDLE hFileMappingObject = CreateFileMapping(hFile,
NULL,PAGE_READWRITE,0,nFileSize,NULL);
PVOID pAddress = MapViewOfFile(hFileMappingObject,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
LPSTR szBytePoint = (LPSTR)pAddress;
WORD nStrSize = sizeof(COUNTINFORMATION);
DWORD nCount = nFileSize/nStrSize;
DWORD dwOffset = 0;
LPCOUNTINFORMATION lpSource;
for (DWORD i=0;i
{
lpSource = (LPCOUNTINFORMATION)szBytePoint;
if(stricmp(lpSource->MacAddress,cfm->MacAddress)==0)
{
if(stricmp(lpSource->SoftWareName,cfm->SoftWareName)==0)
{
bResult = TRUE;
dwOffset = i * nStrSize;
break;
}
}
szBytePoint+=nStrSize;
}
if(bResult)
{
//先判断是否是最后一个记录..
if((nFileSize-dwOffset)==nStrSize)
{
UnmapViewOfFile(pAddress);
CloseHandle(hFileMappingObject);
SetFilePointer(hFile,-nStrSize,NULL,FILE_END);
SetEndOfFile(hFile);//截断文件
}
else
{
//数据全部右移 nStrSize
LPCOUNTINFORMATION MovePoint=(LPCOUNTINFORMATION)((CHAR *)(pAddress) + dwOffset);//内存偏移
szBytePoint+=nStrSize;
DWORD nSurplus = nCount-i-1;
for (DWORD n=0;n
{
CopyMemory(MovePoint,szBytePoint,nStrSize);
MovePoint+=nStrSize;
szBytePoint+=nStrSize;
}
FlushViewOfFile(pAddress,nFileSize);
UnmapViewOfFile(pAddress);
CloseHandle(hFileMappingObject);
SetFilePointer(hFile,-nStrSize,NULL,FILE_END);
SetEndOfFile(hFile);//截断文件
}
}
LeaveCriticalSection(&cs);
return bResult;
}