⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.cpp

📁 类似flashget下载工具代码 本来想在完善了上传的
💻 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 + -