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

📄 filebackup.cpp

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

#include "stdafx.h"
#include "FileBackup.h"

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

BOOL CFileBackup::m_fIsInitialized			= FALSE;
DWORD CFileBackup::m_dwOSVersion			= ::GetVersion();
UINT CFileBackup::m_nCurrentANSICodePage	= ::GetACP();

BOOL CFileBackup::CFilenameMaskListA::CFilenameMaskA::IsSubNameMatchA(LPCSTR pcsMask, LPCSTR pcsName)
{
	LPCSTR pMask = pcsMask, pName = pcsName;
	LPCSTR pTempMask, pTempName;
	int nCharLimit = 0;

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

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

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

		pName++;
	}

	return FALSE;
}

BOOL CFileBackup::CFilenameMaskListA::CFilenameMaskA::IsSubNameMatchWithoutDotA(LPCSTR pcsMask, LPCSTR pcsName)
{
	LPCSTR pMask = pcsMask, pName = pcsName;
	LPCSTR pTempMask, pTempName;
	int nCharLimit = 0;

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

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

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

BOOL CFileBackup::CFilenameMaskListW::CFilenameMaskW::IsSubNameMatchW(LPCWSTR pcwsMask, LPCWSTR pcwsName)
{
	LPCWSTR pMask = pcwsMask, pName = pcwsName;
	LPCWSTR pTempMask, pTempName;
	int nCharLimit = 0;

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

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

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

		pName++;
	}

	return FALSE;
}

BOOL CFileBackup::CFilenameMaskListW::CFilenameMaskW::IsSubNameMatchWithoutDotW(LPCWSTR pcwsMask, LPCWSTR pcwsName)
{
	LPCWSTR pMask = pcwsMask, pName = pcwsName;
	LPCWSTR pTempMask, pTempName;
	int nCharLimit = 0;

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

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

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

UINT CFileBackup::CWorkerThread::DummyThreadProc(CWorkerThread* pThis)
{
	UINT nRet = pThis->m_pfnCustomThreadProc(pThis->m_pCustomThreadProcParam);

	if ( nRet == ERROR_SUCCESS )
		return pThis->ExitInstance();
	else
	{
		pThis->ExitInstance();
		return nRet;
	}
}

BOOL CFileBackup::CFileFilterA::CParsedPathItemA::AddIncludePath(LPCSTR pcsPath, LPCSTR pcsFilenameMask, BOOL fIsIncludeFilenameMask, DWORD* pdwFileAttributesMask, BOOL fIsIncludeFileAttributesMask)
{
	if ( (m_dwFlags & CParsedPathItemA::ITEM_TYPE_MASK) != CParsedPathItemA::INTERMEDIA_ITEM )
		return FALSE;

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

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

			pPrevChild = NULL;
			pChild = m_pFirstChild;
			while ( pChild && (int)pChild->m_psName < nDrive )
			{
				pPrevChild = pChild;
				pChild = pChild->m_pNextSibling;
			}
			if ( pChild && nDrive == (int)pChild->m_psName )
			{
				if ( fIsLastName )

⌨️ 快捷键说明

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