📄 simplefilebackup.h
字号:
// 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 + -