📄 sourcebuffer.cpp
字号:
#include "stdafx.h"
#include "SourceBuffer.h"
CSourceBuffer::CSourceBuffer ( HANDLE hFileHandle )
: m_hFileHandle ( hFileHandle )
, m_hFileMap ( NULL )
, m_llInBuffer ( 0 )
, m_llOutBuffer ( 0 )
{
m_llFileLength.LowPart = ::GetFileSize ( m_hFileHandle, &m_llFileLength.HighPart );
m_llInBuffer = m_llFileLength.QuadPart;
_ASSERT ( INVALID_HANDLE_VALUE != m_hFileHandle );
m_hFileMap = ::CreateFileMapping ( m_hFileHandle,
NULL,
PAGE_READONLY,
0,
0,
NULL );
_ASSERT ( NULL != m_hFileMap );
::GetSystemInfo ( &m_tagSinf );
// dwTmp = 1024 * 1024 * 8;
m_dwAllocationGranularity = m_tagSinf.dwAllocationGranularity;
m_llFileLengthTmp = 0;
}
CSourceBuffer::~CSourceBuffer ( )
{
if ( m_hFileMap ) {
CloseHandle ( m_hFileMap );
m_hFileMap = NULL;
}
m_llInBuffer = 0;
m_llOutBuffer = 0;
};
// true - success
BOOL CSourceBuffer::GetFileData ( DWORD *dwDWord, DWORD *dwDataLength )
{
DWORD dwBytesInBlock, dwTmpOut;
DWORD dwRemain = (DWORD)(m_llInBuffer - m_llOutBuffer);
PBYTE pbData;
if ( m_llOutBuffer >= m_llInBuffer ) return FALSE;
if (*dwDataLength > dwRemain) *dwDataLength = dwRemain;
// if ( (m_llInBuffer - m_llFileLengthTmp) < m_dwAllocationGranularity )
// dwBytesInBlock = m_dwAllocationGranularity;
// else dwBytesInBlock = *dwDataLength;
dwTmpOut = (DWORD)(m_llOutBuffer - m_llFileLengthTmp);
dwBytesInBlock = *dwDataLength + dwTmpOut;
pbData = ( PBYTE )::MapViewOfFile ( m_hFileMap,
FILE_MAP_READ,
(DWORD) ( m_llFileLengthTmp >> 32),
(DWORD) ( m_llFileLengthTmp & 0xFFFFFFFF ),
dwBytesInBlock );
if ( NULL == pbData ) {
::MessageBox ( NULL, "The Map File Failed", "Error", MB_OK );
return FALSE;
}
memcpy((void *)dwDWord, (void *)(pbData + dwTmpOut), *dwDataLength);
UnmapViewOfFile ( pbData );
m_llFileLengthTmp += (*dwDataLength / m_dwAllocationGranularity) * m_dwAllocationGranularity;
m_llOutBuffer += *dwDataLength;
return TRUE;
}
void CSourceBuffer::ForwardJump ( DWORD dwDWord )
{
m_llOutBuffer += ( LONGLONG ) dwDWord;
m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}
void CSourceBuffer::BackwardJump ( DWORD dwDWord )
{
if ( (m_llOutBuffer - dwDWord) > 0) m_llOutBuffer -= dwDWord;
else m_llOutBuffer = 0;
m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}
void CSourceBuffer::JumpToEnd ( DWORD dwBytes )
{
SetFilePointer (m_hFileHandle, dwBytes, NULL, FILE_END);
m_llOutBuffer = m_llInBuffer - dwBytes;
m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}
void CSourceBuffer::JumpToBegin ( DWORD dwBytes )
{
SetFilePointer (m_hFileHandle, dwBytes, NULL, FILE_BEGIN);
m_llOutBuffer = ( LONGLONG ) dwBytes;
m_llFileLengthTmp = (m_llOutBuffer / m_dwAllocationGranularity) * m_dwAllocationGranularity;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -