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

📄 filebackupe.cpp

📁 实时文件备份
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// FileBackup.cpp: implementation of the CFileBackupE class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "FileBackupE.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


CFileBackupE::CGlobalInit CFileBackupE::m_objInitObject;
CFileBackupE::CLargeBufferBlockBank::CLargeBufferPool CFileBackupE::CLargeBufferBlockBank::m_objLargeBufferPool;
CFileBackupE::CMessageQueue::CMessageBufferPool CFileBackupE::CMessageQueue::m_objMessageBufferPool;

//IMPLEMENT_DYNAMIC(CFileBackupE::CVxDException, CException)
#ifdef _AFXDLL
	CRuntimeClass* PASCAL CFileBackupE::CVxDException::_GetBaseClass() { return RUNTIME_CLASS(CException); }
	AFX_COMDAT const AFX_DATADEF CRuntimeClass CFileBackupE::CVxDException::classCFileBackup_CVxDException = {
		"CFileBackup_CVxDException",
		sizeof(class CFileBackupE::CVxDException),
		0xFFFF,
		NULL,
		&(CFileBackupE::CVxDException::_GetBaseClass),
		NULL
	};
	CRuntimeClass* CFileBackupE::CVxDException::GetRuntimeClass() const { return ((CRuntimeClass*)(&CFileBackupE::CVxDException::classCFileBackup_CVxDException)); }
#else
	AFX_COMDAT const AFX_DATADEF CRuntimeClass CFileBackupE::CVxDException::classCFileBackup_CVxDException = {
		"CFileBackup_CVxDException",
		sizeof(class CFileBackupE::CVxDException),
		0xFFFF,
		NULL,
		&(CFileBackupE::CVxDException::_GetBaseClass),
		NULL
	};
	CRuntimeClass* CFileBackupE::CVxDException::GetRuntimeClass() const { return ((CRuntimeClass*)(&CFileBackupE::CVxDException::classCFileBackup_CVxDException)); }
#endif

//IMPLEMENT_DYNAMIC(CFileBackupE::CDatabaseAccessThread, CWinThread)
#ifdef _AFXDLL
	CRuntimeClass* PASCAL CFileBackupE::CDatabaseAccessThread::_GetBaseClass() { return RUNTIME_CLASS(CWinThread); }
	AFX_COMDAT const AFX_DATADEF CRuntimeClass CFileBackupE::CDatabaseAccessThread::classCFileBackup_CDatabaseAccessThread = {
		"CFileBackup_CDatabaseAccessThread",
		sizeof(class CFileBackupE::CDatabaseAccessThread),
		0xFFFF,
		NULL,
		&(CFileBackupE::CDatabaseAccessThread::_GetBaseClass),
		NULL
	};
	CRuntimeClass* CFileBackupE::CDatabaseAccessThread::GetRuntimeClass() const { return ((CRuntimeClass*)(&CFileBackupE::CDatabaseAccessThread::classCFileBackup_CDatabaseAccessThread)); }
#else
	AFX_COMDAT const AFX_DATADEF CRuntimeClass CFileBackupE::CDatabaseAccessThread::classCFileBackup_CDatabaseAccessThread = {
		"CFileBackup_CDatabaseAccessThread",
		sizeof(class CFileBackupE::DatabaseAccessThread),
		0xFFFF,
		NULL,
		&(CFileBackupE::CDatabaseAccessThread::_GetBaseClass),
		NULL
	};
	CRuntimeClass* CFileBackupE::CDatabaseAccessThread::GetRuntimeClass() const { return ((CRuntimeClass*)(&CFileBackupE::CDatabaseAccessThread::classCFileBackup_CDatabaseAccessThread)); }
#endif

BEGIN_MESSAGE_MAP(CFileBackupE::CDatabaseAccessThread, CWinThread)

END_MESSAGE_MAP()


BOOL CFileBackupE::CFilenameMaskList::CFilenameMask::IsSubNameMatch(LPCTSTR pcstrMask, LPCTSTR pcstrName)
{
	LPCTSTR pMask = pcstrMask, pName = pcstrName;
	LPCTSTR pTempMask, pTempName;
	int nCharLimit = 0;

	while ( 1 )
	{
		if ( *pMask == _T('*') )
			nCharLimit = INT_MAX;
		else if ( *pMask == _T('?') )
		{
			if ( nCharLimit != INT_MAX )
				nCharLimit++;
		}
		else
			break;
		pMask++;
	}
	if ( *pMask == NULL )
		return _tcslen(pName) <= (unsigned int)nCharLimit;

	while ( nCharLimit-- >= 0 && *pName != NULL )
	{
		pTempMask = pMask;
		pTempName = pName;

		while ( 1 )
		{
			if ( *pTempMask == _T('*') || *pTempMask == _T('?') )
			{
				if ( IsSubNameMatch(pTempMask, pTempName) )
					return TRUE;
				else
					break;
			}
			else
			{
				if ( *pTempMask != *pTempName )
					break;
				else if ( *pTempMask == NULL )
					return TRUE;
			}
			pTempMask++;
			pTempName++;
		}

		pName++;
	}

	return FALSE;
}

BOOL CFileBackupE::CFilenameMaskList::CFilenameMask::IsSubNameMatchWithoutDot(LPCTSTR pcstrMask, LPCTSTR pcstrName)
{
	LPCTSTR pMask = pcstrMask, pName = pcstrName;
	LPCTSTR pTempMask, pTempName;
	int nCharLimit = 0;

	while ( 1 )
	{
		if ( *pMask == _T('*') )
			nCharLimit = INT_MAX;
		else if ( *pMask == _T('?') )
		{
			if ( nCharLimit != INT_MAX )
				nCharLimit++;
		}
		else
			break;
		pMask++;
	}
	if ( *pMask == NULL )
		return _tcslen(pName) <= (unsigned int)nCharLimit;

	pTempMask = pMask;
	pTempName = pName;
	while ( nCharLimit-- >= 0 && *pName != NULL )
	{
		while ( 1 )
		{
			if ( *pTempMask == _T('*') || *pTempMask == _T('?') )
			{
				if ( IsSubNameMatchWithoutDot(pTempMask, pTempName) )
					return TRUE;
				else
					break;
			}
			else
			{
				if ( *pTempMask != *pTempName )
				{
					if ( *pTempName == NULL && *pTempMask == _T('.') && *(pTempMask + 1) == NULL )
						return TRUE;
					else
						break;
				}
				else if ( *pTempMask == NULL )
					return TRUE;
			}
			pTempMask++;
			pTempName++;
		}

		pTempMask = pMask;
		pTempName = ++pName;
	}
	return *pName == 0 && *pTempMask == _T('.') && *(pTempMask + 1) == NULL;
}

BOOL CFileBackupE::CFileFilter::CParsedPathItem::AddIncludePath(LPCTSTR pctsPath, LPCTSTR pctsFilenameMask, BOOL fIsIncludeFilenameMask, DWORD* pdwFileAttributesMask, BOOL fIsIncludeFileAttributesMask)
{
	if ( (m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK) != CParsedPathItem::INTERMEDIA_ITEM )
		return FALSE;

	switch ( m_dwFlags & CParsedPathItem::ITEM_MASK )
	{
	case CParsedPathItem::ROOT_ITEM:
		{
			CParsedPathItem *pPrevChild, *pChild;
			int nDrive;
			BOOL fIsLastName;
			DWORD dwFlags = 0;

			if ( pctsPath[1] != _T(':') || pctsPath[2] != NULL && pctsPath[2] != _T('\\') )
				return FALSE;
			else if ( *pctsPath >= _T('A') && *pctsPath <= _T('Z') )
				nDrive = *pctsPath - _T('A');
			else if ( *pctsPath >= _T('a') && *pctsPath <= _T('z') )
				nDrive = *pctsPath - _T('a');
			else
				return FALSE;
			if ( (fIsLastName = pctsPath[2] == NULL || pctsPath[2] == _T('\\') && pctsPath[3] == NULL) )
			{
				dwFlags = CParsedPathItem::DRIVE_ITEM | CParsedPathItem::INCLUDE_ITEM;
				if ( pctsFilenameMask )
					dwFlags |= fIsIncludeFilenameMask ? CParsedPathItem::INCLUDE_FILENAME_MASK : CParsedPathItem::EXCLUDE_FILENAME_MASK;
				if ( pdwFileAttributesMask )
					dwFlags |= fIsIncludeFileAttributesMask ? CParsedPathItem::INCLUDE_FILE_ATTRIBUTES_MASK : CParsedPathItem::EXCLUDE_FILE_ATTRIBUTES_MASK;
			}
			else
				dwFlags = CParsedPathItem::DRIVE_ITEM | CParsedPathItem::INTERMEDIA_ITEM;

			pPrevChild = NULL;
			pChild = m_pFirstChild;
			while ( pChild && (int)pChild->m_ptsName < nDrive )
			{
				pPrevChild = pChild;
				pChild = pChild->m_pNextSibling;
			}
			if ( pChild && nDrive == (int)pChild->m_ptsName )
			{
				if ( fIsLastName )
					return pChild->SetItemData(pctsPath, pctsFilenameMask, pdwFileAttributesMask ? *pdwFileAttributesMask : 0, dwFlags);
				else
					return pChild->AddIncludePath(pctsPath + 3, pctsFilenameMask, fIsIncludeFilenameMask, pdwFileAttributesMask, fIsIncludeFileAttributesMask);
			}
			else
			{
				pChild = new CParsedPathItem(this, pctsPath, pctsFilenameMask, pdwFileAttributesMask ? *pdwFileAttributesMask : 0, dwFlags);
				if ( pPrevChild == NULL )
				{
					pChild->m_pNextSibling = m_pFirstChild;
					m_pFirstChild = pChild;
				}
				else
				{
					pChild->m_pNextSibling = pPrevChild->m_pNextSibling;
					pPrevChild->m_pNextSibling = pChild;
				}
				if ( fIsLastName )
					return TRUE;
				else
					return pChild->AddIncludePath(pctsPath + 3, pctsFilenameMask, fIsIncludeFilenameMask, pdwFileAttributesMask, fIsIncludeFileAttributesMask);
			}
		}
	case CParsedPathItem::DRIVE_ITEM:
	case CParsedPathItem::DIRECTORY_OR_FILE_ITEM:
		{
			CParsedPathItem *pPrevChild = NULL, *pChild = m_pFirstChild;
			TCHAR tsPathName[MAX_PATH];
			int nLen;
			BOOL fIsLastName;
			DWORD dwFlags = 0;
			int nCompare;

			for ( nLen = 0; pctsPath[nLen] && pctsPath[nLen] != _T('\\'); nLen++ )
				tsPathName[nLen] = LOWER(pctsPath[nLen]);
			tsPathName[nLen] = NULL;
			if ( (fIsLastName = pctsPath[nLen] == NULL || pctsPath[nLen] == _T('\\') && pctsPath[nLen + 1] == NULL) )
			{
				dwFlags = CParsedPathItem::DIRECTORY_OR_FILE_ITEM | CParsedPathItem::INCLUDE_ITEM;
				if ( pctsFilenameMask )
					dwFlags |= fIsIncludeFilenameMask ? CParsedPathItem::INCLUDE_FILENAME_MASK : CParsedPathItem::EXCLUDE_FILENAME_MASK;
				if ( pdwFileAttributesMask )
					dwFlags |= fIsIncludeFileAttributesMask ? CParsedPathItem::INCLUDE_FILE_ATTRIBUTES_MASK : CParsedPathItem::EXCLUDE_FILE_ATTRIBUTES_MASK;
			}
			else
				dwFlags = CParsedPathItem::DIRECTORY_OR_FILE_ITEM | CParsedPathItem::INTERMEDIA_ITEM;

			nCompare = -1;
			while ( pChild && (nLen != *(pChild->m_ptsName - 1) || (nCompare = _tcsncmp(pChild->m_ptsName, tsPathName, nLen)) < 0) )
			{
				pPrevChild = pChild;
				pChild = pChild->m_pNextSibling;
			}
			if ( pChild && nCompare == 0 )
			{
				if ( fIsLastName )
					return pChild->SetItemData(tsPathName, pctsFilenameMask, pdwFileAttributesMask ? *pdwFileAttributesMask : 0, dwFlags);
				else
					return pChild->AddIncludePath(pctsPath + nLen + 1, pctsFilenameMask, fIsIncludeFilenameMask, pdwFileAttributesMask, fIsIncludeFileAttributesMask);
			}
			else
			{
				pChild = new CParsedPathItem(this, tsPathName, pctsFilenameMask, pdwFileAttributesMask ? *pdwFileAttributesMask : 0, dwFlags);
				if ( pPrevChild == NULL )
				{
					pChild->m_pNextSibling = m_pFirstChild;
					m_pFirstChild = pChild;
				}
				else
				{
					pChild->m_pNextSibling = pPrevChild->m_pNextSibling;
					pPrevChild->m_pNextSibling = pChild;
				}
				if ( fIsLastName )
					return TRUE;
				else
					return pChild->AddIncludePath(pctsPath + nLen + 1, pctsFilenameMask, fIsIncludeFilenameMask, pdwFileAttributesMask, fIsIncludeFileAttributesMask);
			}
		}
	}
	return FALSE;
}

BOOL CFileBackupE::CFileFilter::CParsedPathItem::AddExcludePath(LPCTSTR pctsPath, BOOL fUnderIncludePath)
{
	switch ( m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
	{
	case CParsedPathItem::EXCLUDE_ITEM:
		return FALSE;
	case CParsedPathItem::INCLUDE_ITEM:
		fUnderIncludePath = TRUE;
	}

	switch ( m_dwFlags & CParsedPathItem::ITEM_MASK )
	{
	case CParsedPathItem::ROOT_ITEM:
		{
			CParsedPathItem *pPrevChild, *pChild;
			int nDrive;
			BOOL fIsLastName;

			if ( pctsPath[1] != _T(':') )
				return FALSE;
			else if ( *pctsPath >= _T('A') && *pctsPath <= _T('Z') )
				nDrive = *pctsPath - _T('A');
			else if ( *pctsPath >= _T('a') && *pctsPath <= _T('z') )
				nDrive = *pctsPath - _T('a');
			else
				return FALSE;
			fIsLastName = pctsPath[2] == NULL || pctsPath[2] == _T('\\') && pctsPath[3] == NULL;

			pPrevChild = NULL;
			pChild = m_pFirstChild;
			while ( pChild && (int)pChild->m_ptsName < nDrive )
			{
				pPrevChild = pChild;
				pChild = pChild->m_pNextSibling;
			}
			if ( pChild && nDrive == (int)pChild->m_ptsName )
			{
				if ( fIsLastName )
					return pChild->SetItemData(pctsPath, NULL, 0, CParsedPathItem::EXCLUDE_ITEM | CParsedPathItem::DRIVE_ITEM);
				else
					return pChild->AddExcludePath(pctsPath + 3, fUnderIncludePath);
			}
			if ( !fUnderIncludePath )
				return FALSE;
			else
			{
				pChild = new CParsedPathItem(this, pctsPath, NULL, 0, fIsLastName ? (CParsedPathItem::EXCLUDE_ITEM | CParsedPathItem::DRIVE_ITEM) : (CParsedPathItem::INTERMEDIA_ITEM | CParsedPathItem::DRIVE_ITEM));
				if ( pPrevChild == NULL )
				{
					pChild->m_pNextSibling = m_pFirstChild;
					m_pFirstChild = pChild;
				}
				else
				{
					pChild->m_pNextSibling = pPrevChild->m_pNextSibling;
					pPrevChild->m_pNextSibling = pChild;
				}
				if ( fIsLastName )
					return TRUE;
				else
					return pChild->AddExcludePath(pctsPath + 3, fUnderIncludePath);
			}
		}
	case CParsedPathItem::DRIVE_ITEM:
	case CParsedPathItem::DIRECTORY_OR_FILE_ITEM:
		{
			CParsedPathItem *pPrevChild = NULL, *pChild = m_pFirstChild;
			TCHAR tsPathName[MAX_PATH];
			int nLen;
			BOOL fIsLastName;
			int nCompare;

			for ( nLen = 0; pctsPath[nLen] && pctsPath[nLen] != _T('\\'); nLen++ )
				tsPathName[nLen] = LOWER(pctsPath[nLen]);
			tsPathName[nLen] = NULL;
			fIsLastName = pctsPath[nLen] == NULL || pctsPath[nLen] == _T('\\') && pctsPath[nLen + 1] == NULL;

			nCompare = -1;
			while ( pChild && (nLen != *(pChild->m_ptsName - 1) || (nCompare = _tcsncmp(pChild->m_ptsName, tsPathName, nLen)) < 0) )
			{
				pPrevChild = pChild;
				pChild = pChild->m_pNextSibling;
			}
			if ( pChild && nCompare == 0 )
			{
				if ( fIsLastName )
					return pChild->SetItemData(tsPathName, NULL, 0, CParsedPathItem::EXCLUDE_ITEM | CParsedPathItem::DIRECTORY_OR_FILE_ITEM);
				else
					return pChild->AddExcludePath(pctsPath + nLen + 1, fUnderIncludePath);
			}
			if ( !fUnderIncludePath )
				return FALSE;
			else
			{
				pChild = new CParsedPathItem(this, tsPathName, NULL, 0, fIsLastName ? (CParsedPathItem::EXCLUDE_ITEM | CParsedPathItem::DIRECTORY_OR_FILE_ITEM) : (CParsedPathItem::INTERMEDIA_ITEM | CParsedPathItem::DIRECTORY_OR_FILE_ITEM));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -