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

📄 filebackup.h

📁 实时文件备份
💻 H
📖 第 1 页 / 共 5 页
字号:
// FileBackupE.h: interface for the CFileBackupE class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_FILEBACKUP_H__31C56BDA_1D96_4AB3_96A0_38649ECD6FDE__INCLUDED_)
#define AFX_FILEBACKUP_H__31C56BDA_1D96_4AB3_96A0_38649ECD6FDE__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000


#include <afxtempl.h>
#include "IoCtlCmd.h"


#define BASIC_ERROR(n)									(0x00 + (n))
#define CHANGESHANDLER_ERROR(n)							(0x40 + (n))
#define DATABASETHREAD_ERROR(n)							(0x80 + (n))
#define FILECOPYTHREAD_ERROR(n)							(0xC0 + (n))

#define LOAD_VXD_ERROR									BASIC_ERROR(1)
#define CHANGESHANDLER_MULTIBYTETOWIDECHAR_ERROR		CHANGESHANDLER_ERROR(1)
#define CHANGESHANDLER_WIDECHARTOMULTIBYTE_ERROR		CHANGESHANDLER_ERROR(2)
#define CHANGESHANDLER_GETLONGPATHNAME_ERROR			CHANGESHANDLER_ERROR(3)
#define CHANGESHANDLER_PATHNAMETOOLONG_ERROR			CHANGESHANDLER_ERROR(4)
#define CHANGESHANDLER_POSTFILECHANGES_ERROR			CHANGESHANDLER_ERROR(5)

typedef struct __tag_FileBackup_Callback_Param
{
	DWORD				m_dwCallbackType;
	LPCTSTR				m_pString;
	LPCTSTR				m_pString2;
	DWORD				m_dwPercentageOrErrorCode;	//	percentage or error code
	__int64				m_i64BytesAccessed;
} FILEBACKUP_CALLBACK_PARAM, *PFILEBACKUP_CALLBACK_PARAM;
typedef DWORD (WINAPI *LPFILEBACKUP_CALLBACK)(PFILEBACKUP_CALLBACK_PARAM lParam);


#define	UWM_MYMESSAGE(n)				(WM_APP + 0x0040 + (n))
#define UWM_DESTROY_WORKERTHREAD		UWM_MYMESSAGE(1)
#define UWM_START_LOGGING_FILE_CHANGES	UWM_MYMESSAGE(2)
#define UWM_STOP_LOGGING_FILE_CHANGES	UWM_MYMESSAGE(3)
#define UWM_POST_FILE_CHANGES			UWM_MYMESSAGE(4)

typedef struct __tag_FileBackup_FileChanges_Information
{
	struct __tag_FileBackup_FileChanges_Information*	m_pNext;
	time_t												m_tTime;
	BOOL												m_fNew;
	int													m_nBasePathLength;
	int													m_nPathnameLength;
	TCHAR												m_tsPathname[1];
} FILECHANGES_INFORMATION, *PFILECHANGES_INFORMATION;


inline TCHAR LOWER(TCHAR x) { return ((x) >= _T('A') && (x) <= _T('Z') ? (x) + (_T('a') - _T('A')) : (x)); }
inline TCHAR UPPER(TCHAR x) { return ((x) >= _T('a') && (x) <= _T('z') ? (x) - (_T('a') - _T('A')) : (x)); }

class CFileBackup
{
public:
	class CFilenameMaskListA
	{
	public:
		class CFilenameMaskA
		{
		public:
			typedef enum
			{
				SYNC_FILE_MASK_TYPE_OTHER				= 0,
				SYNC_FILE_MASK_TYPE_ALL					= 1,
				SYNC_FILE_MASK_TYPE_EXT					= 2,
			} FILE_MASK_TYPE;

			inline CFilenameMaskA() : m_psMask(NULL), m_nMaskLen(0), m_nRequiredLen(0), m_enumType(SYNC_FILE_MASK_TYPE_OTHER) {}
			inline CFilenameMaskA(LPCSTR pcsMask) { *this = pcsMask; }
			inline CFilenameMaskA(LPCWSTR pcwsMask) { *this = pcwsMask; }

			inline ~CFilenameMaskA() { MaskStringEmpty(); }

			inline void MaskStringEmpty() { if ( m_psMask != NULL ) delete[] m_psMask; m_psMask = NULL; m_nMaskLen = 0; m_nRequiredLen = 0; }
			inline DWORD MaskStringGetLength() const { return m_nMaskLen; }
			inline void MaskStringMakeLower()
			{
				LPSTR ps = m_psMask;

				while ( *ps != NULL )
				{
					if ( *ps >= 'A' && *ps <= 'Z' )
						*ps = *ps + ('a' - 'A');
					ps++;
				}
			}
			inline void MaskStringMakeUpper()
			{
				LPSTR ps = m_psMask;

				while ( *ps != NULL )
				{
					if ( *ps >= 'a' && *ps <= 'z' )
						*ps = *ps - 'a' + 'A';
					ps++;
				}
			}
			inline BOOL MaskStringSetValue(LPCSTR psValue)
			{
				MaskStringEmpty();
				if ( psValue != NULL && *psValue != NULL )
				{
					m_nMaskLen = ::strlen(psValue);
					m_psMask = new char[m_nMaskLen + 1];
					::memcpy(m_psMask, psValue, m_nMaskLen + 1);
					return TRUE;
				}
				else
					return FALSE;
			}
			inline BOOL MaskStringSetValue(LPCWSTR pwsValue)
			{
				MaskStringEmpty();
				if ( pwsValue != NULL && *pwsValue != NULL )
				{
					int nLen;

					nLen = ::WideCharToMultiByte(CFileBackup::GetCodePage(), 0, pwsValue, -1, NULL, 0, NULL, NULL);
					if ( nLen == 0 )
						return FALSE;
					m_psMask = new char[nLen];
					m_nMaskLen = ::WideCharToMultiByte(CFileBackup::GetCodePage(), 0, pwsValue, -1, m_psMask, nLen, NULL, NULL);
					if ( m_nMaskLen == 0 )
					{
						delete[] m_psMask;
						m_psMask = NULL;
						return FALSE;
					}
					else
						return TRUE;
				}
				else
					return FALSE;
			}

			inline int MaskStringCompareNoCase(LPCSTR psStr) const
			{
				return ::stricmp(m_psMask, psStr);
			}
			inline int MaskStringCompareNoCase(LPCWSTR pwsStr) const
			{
				char sStr[MAX_PATH];

				if ( ::WideCharToMultiByte(CFileBackup::GetCodePage(), 0, pwsStr, -1, sStr, sizeof(sStr), NULL, NULL) == 0 )
					return 1;
				else
					return ::stricmp(m_psMask, sStr);
			}

			inline void Reset() { MaskStringEmpty(); m_enumType = SYNC_FILE_MASK_TYPE_OTHER; }

			inline CFilenameMaskA& operator =(LPCSTR pcsMask)
			{
				LPCSTR pStart;

				if ( IsAllMask(pcsMask) )
				{
					m_enumType = SYNC_FILE_MASK_TYPE_ALL;
					MaskStringEmpty();
				}
				else if ( IsExtMask(pcsMask, &pStart) )
				{
					m_enumType = SYNC_FILE_MASK_TYPE_EXT;
					MaskStringSetValue(pStart);
				}
				else
				{
					char sCleanMask[MAX_PATH];
					LPCSTR pMask;

					m_enumType = SYNC_FILE_MASK_TYPE_OTHER;
					MaskStringSetValue(CleanMask(pcsMask, sCleanMask));

					pMask = m_psMask;
					m_nRequiredLen = 0;
					while ( *pMask != NULL )
					{
						if ( *pMask != '*' && *pMask != '?' )
							m_nRequiredLen++;
						pMask++;
					}
				}
				MaskStringMakeLower();
				return *this;
			}
			inline CFilenameMaskA& operator =(LPCWSTR pcwsMask)
			{
				LPCWSTR pStart;

				if ( IsAllMask(pcwsMask) )
				{
					m_enumType = SYNC_FILE_MASK_TYPE_ALL;
					MaskStringEmpty();
				}
				else if ( IsExtMask(pcwsMask, &pStart) )
				{
					m_enumType = SYNC_FILE_MASK_TYPE_EXT;
					MaskStringSetValue(pStart);
				}
				else
				{
					WCHAR wsCleanMask[MAX_PATH];
					LPCSTR pMask;

					m_enumType = SYNC_FILE_MASK_TYPE_OTHER;
					MaskStringSetValue(CleanMask(pcwsMask, wsCleanMask));

					pMask = m_psMask;
					m_nRequiredLen = 0;
					while ( *pMask != NULL )
					{
						if ( *pMask != '*' && *pMask != '?' )
							m_nRequiredLen++;
						pMask++;
					}
				}
				MaskStringMakeLower();
				return *this;
			}

			inline BOOL operator ==(LPCSTR pcsMask) const
			{
				LPCSTR pStart;
				char sCleanMask[MAX_PATH];

				if ( IsAllMask(pcsMask) )
					return m_enumType == SYNC_FILE_MASK_TYPE_ALL;
				else if ( IsExtMask(pcsMask, &pStart) )
					return m_enumType == SYNC_FILE_MASK_TYPE_EXT && MaskStringCompareNoCase(pStart) == 0;
				else
					return m_enumType == SYNC_FILE_MASK_TYPE_OTHER && MaskStringCompareNoCase(CleanMask(pcsMask, sCleanMask)) == 0;
			}
			inline BOOL operator ==(LPCWSTR pcwsMask) const
			{
				LPCWSTR pStart;
				WCHAR wsCleanMask[MAX_PATH];

				if ( IsAllMask(pcwsMask) )
					return m_enumType == SYNC_FILE_MASK_TYPE_ALL;
				else if ( IsExtMask(pcwsMask, &pStart) )
					return m_enumType == SYNC_FILE_MASK_TYPE_EXT && MaskStringCompareNoCase(pStart) == 0;
				else
					return m_enumType == SYNC_FILE_MASK_TYPE_OTHER && MaskStringCompareNoCase(CleanMask(pcwsMask, wsCleanMask)) == 0;
			}

			inline BOOL operator ==(const CFilenameMaskA& mask) const
			{
				return m_enumType == mask.m_enumType && m_nMaskLen == mask.m_nMaskLen && m_nRequiredLen == mask.m_nRequiredLen && MaskStringCompareNoCase(mask.m_psMask) == 0;
			}

			inline BOOL operator !=(const CFilenameMaskA& mask) const
			{
				return !(*this == mask);
			}

			inline int Compare(LPCSTR pcsMask) const
			{
				LPCSTR pStart;
				char sCleanMask[MAX_PATH];

				if ( IsAllMask(pcsMask) )
					return m_enumType == SYNC_FILE_MASK_TYPE_ALL ? 0 : 1;
				else if ( IsExtMask(pcsMask, &pStart) )
					return m_enumType == SYNC_FILE_MASK_TYPE_EXT ? MaskStringCompareNoCase(pStart) : m_enumType == SYNC_FILE_MASK_TYPE_ALL ? -1 : 1;
				else
					return m_enumType == SYNC_FILE_MASK_TYPE_OTHER ? MaskStringCompareNoCase(CleanMask(pcsMask, sCleanMask)) : -1;
			}
			inline int Compare(LPCWSTR pcwsMask) const
			{
				LPCWSTR pStart;
				WCHAR wsCleanMask[MAX_PATH];

				if ( IsAllMask(pcwsMask) )
					return m_enumType == SYNC_FILE_MASK_TYPE_ALL ? 0 : 1;
				else if ( IsExtMask(pcwsMask, &pStart) )
					return m_enumType == SYNC_FILE_MASK_TYPE_EXT ? MaskStringCompareNoCase(pStart) : m_enumType == SYNC_FILE_MASK_TYPE_ALL ? -1 : 1;
				else
					return m_enumType == SYNC_FILE_MASK_TYPE_OTHER ? MaskStringCompareNoCase(CleanMask(pcwsMask, wsCleanMask)) : -1;
			}

			inline static BOOL IsAllMask(LPCSTR pcsMask)
			{
				BOOL fCharLimit;

				if ( pcsMask == NULL || *pcsMask == NULL )
					return TRUE;

				fCharLimit = TRUE;
				while ( *pcsMask != NULL )
				{
					if ( *pcsMask == '*' )
						fCharLimit = FALSE;
					else if ( *pcsMask == '.' )
					{
						if ( fCharLimit )
							return FALSE;
						else
							fCharLimit = TRUE;
					}
					else if ( *pcsMask != '?' )
						return FALSE;
					pcsMask++;
				}
				return !fCharLimit;
			}
			inline static BOOL IsAllMask(LPCWSTR pcwsMask)
			{
				BOOL fCharLimit;

				if ( pcwsMask == NULL || *pcwsMask == NULL )
					return TRUE;

				fCharLimit = TRUE;
				while ( *pcwsMask != NULL )
				{
					if ( *pcwsMask == L'*' )
						fCharLimit = FALSE;
					else if ( *pcwsMask == L'.' )
					{
						if ( fCharLimit )
							return FALSE;
						else
							fCharLimit = TRUE;
					}
					else if ( *pcwsMask != L'?' )
						return FALSE;
					pcwsMask++;
				}
				return !fCharLimit;
			}

			inline static BOOL IsExtMask(LPCSTR pcsMask, LPCSTR* ppStart = NULL)
			{
				BOOL fCharLimit;

				if ( pcsMask == NULL || *pcsMask == NULL )
					return FALSE;

				fCharLimit = TRUE;
				while ( *pcsMask != NULL )
				{
					if ( *pcsMask == '*' )
						fCharLimit = FALSE;
					else if ( *pcsMask == '.' )
					{
						if ( fCharLimit )
							return FALSE;
						else
						{
							if ( *++pcsMask == NULL )
								return FALSE;
							if ( ppStart != NULL )
								*ppStart = pcsMask;
							do
							{
								if ( *pcsMask == '*' || *pcsMask == '?' || *pcsMask == '.' )
									return FALSE;
							} while ( *++pcsMask != NULL );
							return TRUE;
						}
					}
					else if ( *pcsMask != '?' )
						return FALSE;
					pcsMask++;
				}
				return FALSE;
			}
			inline static BOOL IsExtMask(LPCWSTR pcwsMask, LPCWSTR* ppStart = NULL)
			{
				BOOL fCharLimit;

				if ( pcwsMask == NULL || *pcwsMask == NULL )
					return FALSE;

				fCharLimit = TRUE;
				while ( *pcwsMask != NULL )
				{
					if ( *pcwsMask == L'*' )
						fCharLimit = FALSE;
					else if ( *pcwsMask == L'.' )
					{
						if ( fCharLimit )
							return FALSE;
						else
						{
							if ( *++pcwsMask == NULL )
								return FALSE;
							if ( ppStart != NULL )
								*ppStart = pcwsMask;
							do
							{
								if ( *pcwsMask == L'*' || *pcwsMask == L'?' || *pcwsMask == L'.' )
									return FALSE;
							} while ( *++pcwsMask != NULL );
							return TRUE;
						}
					}
					else if ( *pcwsMask != L'?' )
						return FALSE;
					pcwsMask++;
				}
				return FALSE;
			}

			inline static LPCSTR CleanMask(LPCSTR pcsMask, LPSTR pcsNewMask)
			{
				LPSTR pNewMask = pcsNewMask;
				int nQuestionMarkLen = 0;

				while ( *pcsMask != NULL )
				{
					if ( *pcsMask == '*' )
					{
						*pNewMask++ = '*';
						nQuestionMarkLen = 0;
						while ( *pcsMask == '*' || *pcsMask == '?' )
							pcsMask++;
						continue;
					}
					else if ( *pcsMask == '?' )
						nQuestionMarkLen++;
					else
					{
						while ( nQuestionMarkLen > 0 )
						{
							*pNewMask++ = '?';
							nQuestionMarkLen--;
						}
						*pNewMask++ = *pcsMask;
					}
					pcsMask++;
				}
				*pNewMask = NULL;
				return pcsNewMask;
			}
			inline static LPCWSTR CleanMask(LPCWSTR pcwsMask, LPWSTR pcwsNewMask)
			{
				LPWSTR pNewMask = pcwsNewMask;
				int nQuestionMarkLen = 0;

				while ( *pcwsMask != NULL )
				{
					if ( *pcwsMask == L'*' )
					{
						*pNewMask++ = L'*';
						nQuestionMarkLen = 0;
						while ( *pcwsMask == L'*' || *pcwsMask == L'?' )
							pcwsMask++;
						continue;
					}
					else if ( *pcwsMask == L'?' )
						nQuestionMarkLen++;
					else
					{
						while ( nQuestionMarkLen > 0 )
						{
							*pNewMask++ = L'?';
							nQuestionMarkLen--;
						}
						*pNewMask++ = *pcwsMask;
					}
					pcwsMask++;
				}
				*pNewMask = NULL;
				return pcwsNewMask;
			}
/*			inline static CString CleanMask(LPCTSTR pcstrMask)
			{
				CString csNewMask;
				int nOrgMaskLen = _tcslen(pcstrMask);
				LPCTSTR pOrgMask = pcstrMask;
				LPTSTR pNewMask = csNewMask.GetBuffer(nOrgMaskLen + 1);
				int nQuestionMarkLen = 0;

				while ( *pOrgMask != NULL )
				{
					if ( *pOrgMask == _T('*') )
					{
						*pNewMask++ = _T('*');
						nQuestionMarkLen = 0;
						while ( *pOrgMask == _T('*') || *pOrgMask == _T('?') )

⌨️ 快捷键说明

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