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

📄 simplefilebackup.h

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

#if !defined(AFX_SIMPLEFILEBACKUP_H__A566D96D_9A7C_4E41_A5F5_34C47A9AA784__INCLUDED_)
#define AFX_SIMPLEFILEBACKUP_H__A566D96D_9A7C_4E41_A5F5_34C47A9AA784__INCLUDED_

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


#include <afx.h>
#include <afxwin.h>			//	MFC core and standard components
//#include <afxext.h>		//	MFC extensions
#include <afxdao.h>			//	MFC DAO support
#include <afxtempl.h>		//	MFC template library support
#include "IoCtlCmd.h"		//	Win9x File Filter Driver support


#ifdef USE_DAO36
	class _AFX_DAO_STATE : public CNoTrackObject
	{
	public:
		// Handle initialization and cleanup of OLE and DAO
		_AFX_DAO_STATE();
		virtual ~_AFX_DAO_STATE();

		// MFC/DAO global data
		BOOL m_bOleInitialized;
		DAODBEngine* m_pDAODBEngine;
		CMapPtrToPtr m_mapWorkspaces;
	};

	_AFX_DAO_STATE* AFX_CDECL AfxGetDaoState();

	#ifndef _AFXDLL
		#define _AfxDetermineDaoVersion()   (36)
	#else // dynamically because of DLL
		static inline BYTE _AfxDetermineDaoVersion()
		{
			BYTE bReturn = 36;

		#ifdef _AFXDLL
			AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
			if (pModuleState->m_dwVersion < 0x421)
				bReturn = 30;
		#endif // _AFXDLL

			return bReturn;
		}
	#endif

	void AFXAPI InternalAfxDaoInit()
	{
		_AFX_DAO_STATE* pDaoState = AfxGetDaoState();

		// Attempt to initialize OLE component objects
		//  (use default IMalloc allocator)
		DAO_CHECK_ERROR(::CoInitialize(NULL),
			AFX_DAO_ERROR_ENGINE_INITIALIZATION);
		pDaoState->m_bOleInitialized = TRUE;

		// Hook AfxDaoTerm to CWinApp, otherwise explicit AfxDaoTerm call req'd
		CWinApp* pApp = AfxGetApp();
		if (pApp != NULL)
			pApp->m_lpfnDaoTerm = AfxDaoTerm;

		BYTE bUseDao = _AfxDetermineDaoVersion();

		CLSID clsidEngine;
		COleVariant varKey;
		GUID guidEngine;

		// Set the interface type
	#ifdef _UNICODE
				guidEngine = IID_IDAODBEngineW;
	#else
				guidEngine = IID_IDAODBEngine;
	#endif

		// DAO 3.6 runtime key
		varKey = _T("mbmabptebkjcdlgtjmskjwtsdhjbmkmwtrak");

		switch (bUseDao)
		{
			case 30:
				// Use DAO 3.0
				clsidEngine = CLSID30_CDAODBEngine;

				// DAO 3.0 runtime key
				varKey = _T("mjgcqcejfchcijecpdhckcdjqigdejfccjri");

				// Set the interface type
	#ifdef _UNICODE
				guidEngine = IID30_IDAODBEngineW;
	#else
				guidEngine = IID30_IDAODBEngine;
	#endif
				break;

			case 36:
				// Use DAO 3.6
				clsidEngine = CLSID_CDAODBEngine;
				break;

			default:
				ASSERT(FALSE);
		}

		LPCLASSFACTORY2 pCF2;
		DAO_CHECK_ERROR(::CoGetClassObject(clsidEngine,
			CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory2, (LPVOID*)&pCF2),
			AFX_DAO_ERROR_ENGINE_INITIALIZATION);

		TRY
		{
			DAO_CHECK_ERROR(pCF2->CreateInstanceLic( NULL, NULL, guidEngine,
				V_BSTR(&varKey), (LPVOID*)&pDaoState->m_pDAODBEngine),
				AFX_DAO_ERROR_ENGINE_INITIALIZATION);
		}
		CATCH_ALL(e)
		{
			pCF2->Release();
			THROW_LAST();
		}
		END_CATCH_ALL

		pCF2->Release();
	}
#else
	#define InternalAfxDaoInit		AfxDaoInit
#endif

#define TABLE_NAME				_T("Updated Files")
#define FIELD_FILE_PATHNAME		_T("Pathname")
#define FIELD_FILE_UPDATETIME	_T("Update Time (UTC)")
#define FIELD_FILE_STATUS		_T("Status")

#define PROGRESS_QUIT_AFTER_FINISH_THIS_FILE					(PROGRESS_QUIET + 2)
#define PROGRESS_QUIT_AFTER_FINISH_THIS_OPERATION				(PROGRESS_QUIET + 3)
#define PROGRESS_QUIT_AFTER_ALL_EXISTING_OPERATION				(PROGRESS_QUIET + 4)

#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 FILEENUMERATORTHREAD_ERROR(n)							(0xF0 + (n))

#define LOAD_VXD_FAILED											BASIC_ERROR(1)

#define CHANGESHANDLER_MESSAGE_QUEUE_SEMAPHORE_ABANDONED		CHANGESHANDLER_ERROR(1)
#define CHANGESHANDLER_OVERLAPPED_EVENT_ABANDONED				CHANGESHANDLER_ERROR(2)
#define CHANGESHANDLER_WAITFORSINGLEOBJECT_FAILED				CHANGESHANDLER_ERROR(3)
#define CHANGESHANDLER_READDIRECTORYCHANGESW_FAILED				CHANGESHANDLER_ERROR(4)
#define CHANGESHANDLER_DEVICEIOCONTROL_READCHANGE_FAILED		CHANGESHANDLER_ERROR(5)
#define CHANGESHANDLER_MULTIBYTETOWIDECHAR_FAILED				CHANGESHANDLER_ERROR(6)
#define CHANGESHANDLER_WIDECHARTOMULTIBYTE_FAILED				CHANGESHANDLER_ERROR(7)
#define CHANGESHANDLER_GETLONGPATHNAMEW_FAILED					CHANGESHANDLER_ERROR(8)
#define CHANGESHANDLER_GETLONGPATHNAMEA_FAILED					CHANGESHANDLER_ERROR(9)
#define CHANGESHANDLER_GETFILEATTRIBUTESW_FAILED				CHANGESHANDLER_ERROR(10)
#define CHANGESHANDLER_GETFILEATTRIBUTESA_FAILED				CHANGESHANDLER_ERROR(11)
#define CHANGESHANDLER_POSTFILECHANGES_FAILED					CHANGESHANDLER_ERROR(12)

#define DATABASETHREAD_UPDATE_FILE_CHANGE_RECORD_FAILED			DATABASETHREAD_ERROR(1)
#define DATABASETHREAD_GETWAITINGRECORDS_FAILED					DATABASETHREAD_ERROR(2)
#define DATABASETHREAD_GETMINWAITTIME_FAILED					DATABASETHREAD_ERROR(3)
#define DATABASETHREAD_SETTIMER_FAILED							DATABASETHREAD_ERROR(4)
#define DATABASETHREAD_POSTREALTIMECOPYFILES_FAILED				DATABASETHREAD_ERROR(5)
#define DATABASETHREAD_STARTCOPYING_FAILED						DATABASETHREAD_ERROR(6)
#define DATABASETHREAD_FINISHEDCOPYING_FAILED					DATABASETHREAD_ERROR(7)
#define DATABASETHREAD_FAILEDINCOPYING_FAILED					DATABASETHREAD_ERROR(8)
#define DATABASETHREAD_FILEPATHNAME_CANT_BE_OVER_255_UP_TO_NOW	DATABASETHREAD_ERROR(9)
#define DATABASETHREAD_CANCELALLREALTIMECOPYFILESMESSAGE_FAILED	DATABASETHREAD_ERROR(10)

#define COPYFILES_MESSAGE_QUEUE_SEMAPHORE_ABANDONED				FILECOPYTHREAD_ERROR(1)
#define COPYFILES_WAITFORSINGLEOBJECT_FAILED					FILECOPYTHREAD_ERROR(2)
#define COPYFILES_TERMINATE_WHILE_MESSAGE_QUEUE_NOT_EMPTY		FILECOPYTHREAD_ERROR(3)
#define COPYFILES_READY_TO_COPY_FILE							FILECOPYTHREAD_ERROR(4)
#define COPYFILES_ONE_CHUNK_FINISHED_IN_COPYING_FILE			FILECOPYTHREAD_ERROR(5)
#define COPYFILES_FINISHED_COPYING_FILE							FILECOPYTHREAD_ERROR(6)
#define COPYFILES_MERGE_REVISION_SHFILEOPERATION_MOVE_FAILED	FILECOPYTHREAD_ERROR(7)
#define COPYFILES_MERGE_REVISION_SHFILEOPERATION_RENAME_FAILED	FILECOPYTHREAD_ERROR(8)
#define COPYFILES_MERGE_REVISION_SHFILEOPERATION_DELETE_FAILED	FILECOPYTHREAD_ERROR(9)
#define COPYFILES_DESTINATION_PATHNAME_IS_OVER_MAXPATH			FILECOPYTHREAD_ERROR(10)
#define COPYFILES_COPYFILEEX_FAILED_RATHER_THAN_CANCELLED		FILECOPYTHREAD_ERROR(11)
#define COPYFILES_MULTIBYTETOWIDECHAR_FAILED					FILECOPYTHREAD_ERROR(12)
#define COPYFILES_WIDECHARTOMULTIBYTE_FAILED					FILECOPYTHREAD_ERROR(13)
#define SHEDULEDCOPYFILES_FINDFIRSTFILEW_FAILED					FILECOPYTHREAD_ERROR(14)
#define SHEDULEDCOPYFILES_FINDFIRSTFILEA_FAILED					FILECOPYTHREAD_ERROR(15)

#define ENUMERATEFILE_MESSAGE_QUEUE_SEMAPHORE_ABANDONED			FILEENUMERATORTHREAD_ERROR(1)
#define ENUMERATEFILE_WAITFORSINGLEOBJECT_FAILED				FILEENUMERATORTHREAD_ERROR(2)
#define ENUMERATEFILE_MULTIBYTETOWIDECHAR_FAILED				FILEENUMERATORTHREAD_ERROR(3)
#define ENUMERATEFILE_WIDECHARTOMULTIBYTE_FAILED				FILEENUMERATORTHREAD_ERROR(4)
#define ENUMERATEFILE_POSTSHEDULEDCOPYFILES_FAILED				FILEENUMERATORTHREAD_ERROR(5)

typedef struct __tag_FileBackup_Callback_Param
{
	DWORD				m_dwCallbackType;
	LPARAM				m_lParam;
	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)
#define UWM_START_REVISION_CONTROL				UWM_MYMESSAGE(5)
#define UWM_STOP_REVISION_CONTROL				UWM_MYMESSAGE(6)
#define UWM_SET_REVISION_INFO					UWM_MYMESSAGE(7)
#define UWM_POST_REALTIME_COPY_FILES			UWM_MYMESSAGE(8)
#define UWM_POST_SCHEDULED_COPY_FILES			UWM_MYMESSAGE(9)
#define UWM_START_INSTANT_BACKUP				UWM_MYMESSAGE(10)
#define UWM_STOP_INSTANT_BACKUP					UWM_MYMESSAGE(11)
#define UWM_CANCELALLREALTIMECOPYFILESMESSAGE	UWM_MYMESSAGE(12)
#define UWM_INITIALIZE_DATABASE					UWM_MYMESSAGE(13)
#define UWM_UNINITIALIZE_DATABASE				UWM_MYMESSAGE(14)
#define UWM_START_COPYING_FILE_CALLBACK			UWM_MYMESSAGE(15)
#define UWM_CANCEL_COPYING_FILE_CALLBACK		UWM_MYMESSAGE(16)
#define UWM_FINISHED_COPYING_FILE_CALLBACK		UWM_MYMESSAGE(17)
#define UWM_FAILED_IN_COPYING_FILE_CALLBACK		UWM_MYMESSAGE(18)
#define UWM_SET_LOG_MODE						UWM_MYMESSAGE(19)

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


#define COPYFILES_EVENT_START_COPYING		0
#define COPYFILES_EVENT_CANCEL_COPYING		1
#define COPYFILES_EVENT_COPYING_FAILED		2
#define COPYFILES_EVENT_FINISHED_COPYING	3
struct __tag_CopyFiles_Buffer;
typedef DWORD (WINAPI *LPFILECOPYFINISHED_CALLBACK)(LPARAM lParam, LPCTSTR pctsFilename, int nEvent, struct __tag_CopyFiles_Buffer* pBuffer);
typedef struct __tag_CopyFiles_Item
{
	struct __tag_CopyFiles_Item*						m_pNext;
	ULARGE_INTEGER										m_u64UpdateTime;
	TCHAR												m_tsFilename[1];
} COPYFILES_ITEM, *PCOPYFILES_ITEM;
typedef struct __tag_CopyFiles_Buffer
{
	LPFILECOPYFINISHED_CALLBACK							m_pCallback;
	LPARAM												m_lParam;
	COPYFILES_ITEM										m_objItem;
} COPYFILES_BUFFER, *PCOPYFILES_BUFFER;

struct __tag_ScheduledCopyFiles_Buffer;
typedef DWORD (WINAPI *LPSCHEDULEDFILECOPYFINISHED_CALLBACK)(LPARAM lParam, LPCTSTR pctsFilename, int nEvent, struct __tag_ScheduledCopyFiles_Buffer* pBuffer);
typedef struct __tag_ScheduledCopyFiles_Item
{
	struct __tag_ScheduledCopyFiles_Item*				m_pNext;
	TCHAR												m_tsFilename[1];
} SCHEDULEDCOPYFILES_ITEM, *PSCHEDULEDCOPYFILES_ITEM;
typedef struct __tag_ScheduledCopyFiles_Buffer
{
	LPSCHEDULEDFILECOPYFINISHED_CALLBACK				m_pCallback;
	LPARAM												m_lParam;
	ULARGE_INTEGER										m_u64UpdateTime;
	SCHEDULEDCOPYFILES_ITEM								m_objItem;
} SCHEDULEDCOPYFILES_BUFFER, *PSCHEDULEDCOPYFILES_BUFFER;

extern TCHAR g_tsSQLInitializeCrashRecover[];
extern TCHAR g_tsSQLUpdateChangedFile[];
extern TCHAR g_tsSQLGetWaitingRecords[];
extern TCHAR g_tsSQLGetMinWaitTime[];
extern TCHAR* g_tsSQLStartCopying;
//extern TCHAR* g_tsSQLCancelCopying;
extern TCHAR g_tsSQLFinishedCopying[];
extern TCHAR g_tsSQLFailedInCopying[];

#define STATUS_WAITING_FOR_COPYING		1
#define STATUS_QUEUED_IN_COPYING_LIST	2
#define STATUS_COPYING					3
//#define STATUS_UPDATED_WHILE_COPYING	4

inline char LOWER(char x) { return ((x) >= 'A' && (x) <= 'Z' ? (x) - 'A' + 'a' : (x)); }
inline WCHAR LOWER(WCHAR x) { return ((x) >= L'A' && (x) <= L'Z' ? (x) - L'A' + L'a' : (x)); }

#if !defined(_DEBUG) && !defined(DEBUG)
	#define dprintf()
#else
	#define dprintf		_tprintf
#endif

class CSimpleFileBackup  
{
public:

	class CFilenameMaskList
	{
	public:
		class CFilenameMask
		{
		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 CFilenameMask() : m_enumType(SYNC_FILE_MASK_TYPE_OTHER), m_nMaskLen(0), m_nRequiredLen(0) {}
			inline CFilenameMask(LPCTSTR pcstrMask) { *this = pcstrMask; }

			inline void Reset() { m_csMask.Empty(); m_enumType = SYNC_FILE_MASK_TYPE_OTHER; m_nMaskLen = m_nRequiredLen = 0; }

			inline CFilenameMask& operator =(LPCTSTR pcstrMask)
			{
				LPCTSTR pStart;

				if ( IsAllMask(pcstrMask) )
				{
					m_enumType = SYNC_FILE_MASK_TYPE_ALL;
					m_csMask.Empty();
				}
				else if ( IsExtMask(pcstrMask, &pStart) )
				{
					m_enumType = SYNC_FILE_MASK_TYPE_EXT;
					m_csMask = pStart;
				}
				else
				{
					LPCTSTR pMask;

					m_enumType = SYNC_FILE_MASK_TYPE_OTHER;
					m_csMask = CleanMask(pcstrMask);

					pMask = m_csMask;
					m_nRequiredLen = 0;
					while ( *pMask != NULL )
					{
						if ( *pMask != _T('*') && *pMask != _T('?') )
							m_nRequiredLen++;
						pMask++;
					}
				}
				m_nMaskLen = m_csMask.GetLength();
				m_csMask.MakeLower();
				return *this;
			}

			inline BOOL operator ==(LPCTSTR pcstrMask) const
			{
				LPCTSTR pStart;

				if ( IsAllMask(pcstrMask) )
					return m_enumType == SYNC_FILE_MASK_TYPE_ALL;
				else if ( IsExtMask(pcstrMask, &pStart) )
					return m_enumType == SYNC_FILE_MASK_TYPE_EXT && m_csMask.CompareNoCase(pStart) == 0;
				else
					return m_enumType == SYNC_FILE_MASK_TYPE_OTHER && m_csMask.CompareNoCase(CleanMask(pcstrMask)) == 0;
			}

			inline BOOL operator ==(const CFilenameMask& mask) const
			{
				return m_enumType == mask.m_enumType && m_csMask.Compare(mask.m_csMask) == 0;
			}

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

			inline int Compare(LPCTSTR pcstrMask) const
			{
				LPCTSTR pStart;

				if ( IsAllMask(pcstrMask) )
					return m_enumType == SYNC_FILE_MASK_TYPE_ALL ? 0 : 1;
				else if ( IsExtMask(pcstrMask, &pStart) )
					return m_enumType == SYNC_FILE_MASK_TYPE_EXT ? m_csMask.CompareNoCase(pStart) : m_enumType == SYNC_FILE_MASK_TYPE_ALL ? -1 : 1;
				else
					return m_enumType == SYNC_FILE_MASK_TYPE_OTHER ? m_csMask.CompareNoCase(CleanMask(pcstrMask)) : -1;
			}

			inline static BOOL IsAllMask(LPCTSTR pcstrMask)
			{
				BOOL fCharLimit;

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

				fCharLimit = TRUE;
				while ( *pcstrMask != NULL )

⌨️ 快捷键说明

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