📄 buffer.cpp
字号:
// Buffer.cpp: implementation of the CBuffer class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Buffer.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CBuffer::CBuffer()
{
m_nSize = 0;
pFile = NULL;
m_pPtr = m_pBase = NULL;
}
CBuffer::~CBuffer()
{
//释放前,将数据写入文件
FileWrite();
if (m_pBase)
VirtualFree(m_pBase,0,MEM_RELEASE);
if(pFile!=NULL)
{
pFile->Close();
pFile = NULL;
}
}
//写数据到缓冲中
BOOL CBuffer::Write(LPCSTR pData, UINT nSize)
{
//判断是否大于阀值
if(GetMemSize()>=m_MaxSize)
{
//将数据写入文件
FileWrite();
return 0;
}
ReAllocateBuffer(nSize + GetBufferLen());
CopyMemory(m_pPtr,pData,nSize);
m_pPtr+=nSize;
return nSize;
}
BOOL CBuffer::Insert(PCHAR pData, UINT nSize)
{
ReAllocateBuffer(nSize + GetBufferLen());
MoveMemory(m_pBase+nSize,m_pBase,GetMemSize() - nSize);
CopyMemory(m_pBase,pData,nSize);
m_pPtr+=nSize;
return nSize;
}
//从缓存中读入数据,并删掉读出了数据的缓冲空间
UINT CBuffer::Read(PCHAR pData, UINT nSize)
{
if (nSize > GetMemSize()) return 0;
// all that we have
if (nSize > GetBufferLen())
nSize = GetBufferLen();
if (nSize)
{
CopyMemory(pData,m_pBase,nSize);
MoveMemory(m_pBase,m_pBase+nSize,GetMemSize() - nSize);
m_pPtr -= nSize;
}
DeAllocateBuffer(GetBufferLen());
return nSize;
}
//返回缓存的空间大小
UINT CBuffer::GetMemSize()
{
return m_nSize;
}
//返回缓存中数据的空间大小
UINT CBuffer::GetBufferLen()
{
if (m_pBase == NULL)
return 0;
int nSize =
m_pPtr - m_pBase;
return nSize;
}
//再分配缓存到给定大小,如果小于缓存的物理大小,则不操作
UINT CBuffer::ReAllocateBuffer(UINT nRequestedSize)
{
if (nRequestedSize < GetMemSize())
return 0;
UINT nNewSize = (UINT) ceil(nRequestedSize / 1024.0) * 1024;
PCHAR pNewBuffer = (PCHAR) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
UINT nBufferLen = GetBufferLen();
CopyMemory(pNewBuffer,m_pBase,nBufferLen);
if (m_pBase)
VirtualFree(m_pBase,0,MEM_RELEASE);
m_pBase = pNewBuffer;
m_pPtr = m_pBase + nBufferLen;
m_nSize = nNewSize;
return m_nSize;
}
//释放缓存空间到给定大小,如果给定大小小于缓存的数据空间,则不操作.
UINT CBuffer::DeAllocateBuffer(UINT nRequestedSize)
{
if (nRequestedSize < GetBufferLen())
return 0;
UINT nNewSize = (UINT) ceil(nRequestedSize / 1024.0) * 1024;
if (nNewSize < GetMemSize())
return 0;
PCHAR pNewBuffer = (PCHAR) VirtualAlloc(NULL,nNewSize,MEM_COMMIT,PAGE_READWRITE);
UINT nBufferLen = GetBufferLen();
CopyMemory(pNewBuffer,m_pBase,nBufferLen);
VirtualFree(m_pBase,0,MEM_RELEASE);
m_pBase = pNewBuffer;
m_pPtr = m_pBase + nBufferLen;
m_nSize = nNewSize;
return m_nSize;
}
//清空缓存
void CBuffer::ClearBuffer()
{
m_pPtr = m_pBase;
DeAllocateBuffer(1024);
}
//写缓存,从数据块最后开始写
BOOL CBuffer::Write(CString& strData)
{
int nSize = strData.GetLength();
return Write((PCHAR) strData.GetBuffer(nSize), nSize);
}
//从缓存头部插入数据
BOOL CBuffer::Insert(CString& strData)
{
int nSize = strData.GetLength();
return Insert((PCHAR) strData.GetBuffer(nSize), nSize);
}
//拷贝缓存
void CBuffer::Copy(CBuffer& buffer)
{
int nReSize = buffer.GetMemSize();
int nSize = buffer.GetBufferLen();
ClearBuffer();
ReAllocateBuffer(nReSize);
m_pPtr = m_pBase + nSize;
CopyMemory(m_pBase,buffer.GetBuffer(),buffer.GetBufferLen());
}
//返回给定位置的缓存
PCHAR CBuffer::GetBuffer(UINT nPos)
{
return m_pBase+nPos;
}
//把缓存写入文件
void CBuffer::FileWrite()
{
pFile->Write(m_pBase,GetBufferLen());
//清空缓存
Delete(m_nSize);
}
//从缓存中删除数据
UINT CBuffer::Delete(UINT nSize)
{
if (nSize > GetMemSize())
return 0;
if (nSize > GetBufferLen())
nSize = GetBufferLen();
if (nSize)
{
//移动内存块
MoveMemory(m_pBase,m_pBase+nSize,GetMemSize() - nSize);
m_pPtr -= nSize;
}
DeAllocateBuffer(GetBufferLen());
return nSize;
}
void CBuffer::OpenFile(CString& Path,long seek,DWORD Style)
{
pFile = new CFile;
if(!pFile->Open((LPCTSTR)Path,Style))
{
return;
}
pFile->Seek(seek,CFile::begin);
}
void CBuffer::SetSeekPoint(long seek)
{
pFile->Seek(seek,CFile::begin);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -