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

📄 filebackup.h

📁 实时文件备份
💻 H
📖 第 1 页 / 共 5 页
字号:
			return !(operator ==(objMaskList));
		}

		inline BOOL operator !=(LPCTSTR pctsMasks) const
		{
			return *this != CFilenameMaskListW(pctsMasks);
		}

		inline void Add(LPCSTR pcsMask)
		{
			char sCleanMask[MAX_PATH];
			POSITION pos = m_clMaskList.GetHeadPosition(), posPrev;

			if ( pcsMask != NULL )
				if ( *pcsMask == NULL )
					pcsMask = NULL;
				else
					pcsMask = CFilenameMaskW::CleanMask(pcsMask, sCleanMask);
			while ( (posPrev = pos) )
			{
				CFilenameMaskW& mask = m_clMaskList.GetNext(pos);
				int nCompare = mask.Compare(pcsMask);

				switch ( nCompare )
				{
				case 1:
					m_clMaskList.InsertBefore(posPrev, CFilenameMaskW(pcsMask));
				case 0:
					return;
				}
			}
			m_clMaskList.AddTail(CFilenameMaskW(pcsMask));
		}
		inline void Add(LPCWSTR pcwsMask)
		{
			WCHAR wsCleanMask[MAX_PATH];
			POSITION pos = m_clMaskList.GetHeadPosition(), posPrev;

			if ( pcwsMask != NULL )
				if ( *pcwsMask == NULL )
					pcwsMask = NULL;
				else
					pcwsMask = CFilenameMaskW::CleanMask(pcwsMask, wsCleanMask);
			while ( (posPrev = pos) )
			{
				CFilenameMaskW& mask = m_clMaskList.GetNext(pos);
				int nCompare = mask.Compare(pcwsMask);

				switch ( nCompare )
				{
				case 1:
					m_clMaskList.InsertBefore(posPrev, CFilenameMaskW(pcwsMask));
				case 0:
					return;
				}
			}
			m_clMaskList.AddTail(CFilenameMaskW(pcwsMask));
		}

		inline void Remove(LPCSTR pcsMask)
		{
			char sCleanMask[MAX_PATH];
			POSITION pos = m_clMaskList.GetHeadPosition(), posPrev;

			if ( pcsMask != NULL )
				if ( *pcsMask == NULL )
					pcsMask = NULL;
				else
					pcsMask = CFilenameMaskW::CleanMask(pcsMask, sCleanMask);
			while ( (posPrev = pos) )
			{
				CFilenameMaskW& mask = m_clMaskList.GetNext(pos);
				int nCompare = mask.Compare(pcsMask);

				switch ( nCompare )
				{
				case 0:
					m_clMaskList.RemoveAt(posPrev);
				case 1:
					return;
				}
			}
		}
		inline void Remove(LPCWSTR pcwsMask)
		{
			WCHAR wsCleanMask[MAX_PATH];
			POSITION pos = m_clMaskList.GetHeadPosition(), posPrev;

			if ( pcwsMask != NULL )
				if ( *pcwsMask == NULL )
					pcwsMask = NULL;
				else
					pcwsMask = CFilenameMaskW::CleanMask(pcwsMask, wsCleanMask);
			while ( (posPrev = pos) )
			{
				CFilenameMaskW& mask = m_clMaskList.GetNext(pos);
				int nCompare = mask.Compare(pcwsMask);

				switch ( nCompare )
				{
				case 0:
					m_clMaskList.RemoveAt(posPrev);
				case 1:
					return;
				}
			}
		}

		inline void RemoveAll() { m_clMaskList.RemoveAll(); }

		inline BOOL IsAvailable(LPCTSTR pcstrMask) const
		{
			POSITION pos = m_clMaskList.GetHeadPosition();

			while ( pos )
			{
				CFilenameMaskW& mask = m_clMaskList.GetNext(pos);
				if ( mask == pcstrMask )
					return TRUE;
			}
			return FALSE;
		}

		inline BOOL IsNameMatch(LPCSTR pcsName) const
		{
			WCHAR wsName[MAX_PATH];

			if ( ::MultiByteToWideChar(CFileBackup::GetCodePage(), 0, pcsName, -1, wsName, sizeof(wsName) / sizeof(*wsName)) == 0 )
				return FALSE;
			else
				return IsNameMatch(wsName);
		}
		inline BOOL IsNameMatch(LPCWSTR pcwsName) const
		{
			POSITION pos = m_clMaskList.GetHeadPosition();

			while ( pos )
			{
				CFilenameMaskW& mask = m_clMaskList.GetNext(pos);
				if ( mask.IsNameMatch(pcwsName) )
					return TRUE;
			}
			return FALSE;
		}

		inline int GetCount() const { m_clMaskList.GetCount(); }
		inline BOOL IsEmpty() const { return m_clMaskList.GetCount() == 0; }

	protected:
		CList<CFilenameMaskW, CFilenameMaskW>		m_clMaskList;
	};

	class CFileFilterA
	{
	public:
		class CParsedPathItemA
		{
		public:
			friend class CFileFilterA;

			typedef enum
			{
				INTERMEDIA_ITEM					= 0L,
				INCLUDE_ITEM					= 1L,
				EXCLUDE_ITEM					= 2L,
				ITEM_TYPE_MASK					= 3L,
				ROOT_ITEM						= (0L << 2),
				DRIVE_ITEM						= (1L << 2),
				DIRECTORY_OR_FILE_ITEM			= (2L << 2),
				ITEM_MASK						= (3L << 2),
				NO_FILENAME_MASK				= (0L << 4),
				INCLUDE_FILENAME_MASK			= (1L << 4),
				EXCLUDE_FILENAME_MASK			= (2L << 4),
				FILENAME_MASK_MASK				= (3L << 4),
				NO_FILE_ATTRIBUTES_MASK			= (0L << 6),
				INCLUDE_FILE_ATTRIBUTES_MASK	= (1L << 6),
				EXCLUDE_FILE_ATTRIBUTES_MASK	= (2L << 6),
				FILE_ATTRIBUTES_MASK_MASK		= (3L << 6),
			} PARSED_PATH_ITEM_FLAGS_BIT_MASK;

			inline CParsedPathItemA(LPCSTR pcsItemName, LPCSTR pcsFilenameMask, DWORD dwFileAttributesMask, DWORD dwFlags) : m_pParent(NULL), m_pFirstChild(NULL), m_pNextSibling(NULL), m_dwFlags(0), m_psName(NULL), m_pFilenameMaskList(NULL), m_dwFileAttributesMask(0)
			{
				SetItemData(pcsItemName, pcsFilenameMask, dwFileAttributesMask, dwFlags);
			}
			inline CParsedPathItemA(LPCWSTR pcwsItemName, LPCWSTR pcwsFilenameMask, DWORD dwFileAttributesMask, DWORD dwFlags) : m_pParent(NULL), m_pFirstChild(NULL), m_pNextSibling(NULL), m_dwFlags(0), m_psName(NULL), m_pFilenameMaskList(NULL), m_dwFileAttributesMask(0)
			{
				SetItemData(pcwsItemName, pcwsFilenameMask, dwFileAttributesMask, dwFlags);
			}

			inline CParsedPathItemA(CParsedPathItemA* pParent, LPCSTR pcsItemName, LPCSTR pcsFilenameMask, DWORD dwFileAttributesMask, DWORD dwFlags) : m_pParent(NULL), m_pFirstChild(NULL), m_pNextSibling(NULL), m_dwFlags(0), m_psName(NULL), m_pFilenameMaskList(NULL), m_dwFileAttributesMask(0)
			{
				SetItemData(pcsItemName, pcsFilenameMask, dwFileAttributesMask, dwFlags);
				m_pParent = pParent;
			}
			inline CParsedPathItemA(CParsedPathItemA* pParent, LPCWSTR pcwsItemName, LPCWSTR pcwsFilenameMask, DWORD dwFileAttributesMask, DWORD dwFlags) : m_pParent(NULL), m_pFirstChild(NULL), m_pNextSibling(NULL), m_dwFlags(0), m_psName(NULL), m_pFilenameMaskList(NULL), m_dwFileAttributesMask(0)
			{
				SetItemData(pcwsItemName, pcwsFilenameMask, dwFileAttributesMask, dwFlags);
				m_pParent = pParent;
			}

			inline ~CParsedPathItemA()
			{
				ClearItemData();
				m_pParent = NULL;
			}

			BOOL AddIncludePath(LPCSTR pcsPath, LPCSTR pcsFilenameMask, BOOL fIsIncludeFilenameMask, DWORD* pdwFileAttributesMask, BOOL fIsIncludeFileAttributesMask);
			BOOL AddExcludePath(LPCSTR pcsPath, BOOL fUnderIncludePath);

			inline PARSED_PATH_ITEM_FLAGS_BIT_MASK MatchFilePathname(LPCSTR pcsFilePathname, CParsedPathItemA*& pItem)
			{
				LPCSTR pChar = pcsFilePathname;
				BOOL fInclude = FALSE;
				CHAR sPathName[MAX_PATH];
				int nLen;
				int nCompare;

				pItem = this;
				if ( (m_dwFlags & CParsedPathItemA::ITEM_MASK) == CParsedPathItemA::ROOT_ITEM )
				{
					int nDrive;

					switch ( m_dwFlags & CParsedPathItemA::ITEM_TYPE_MASK )
					{
					case CParsedPathItemA::INCLUDE_ITEM:
						if ( m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributesA(pcsFilePathname);

							if ( (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (((m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK) == CParsedPathItemA::INCLUDE_FILE_ATTRIBUTES_MASK ? TRUE : FALSE) ^ (m_dwFileAttributesMask & dwFileAttributes)) )
								return EXCLUDE_ITEM;
						}
						if ( (m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) && m_pFilenameMaskList )
						{
							LPCSTR pLastBackSlash, pTempTChar;

							for ( pLastBackSlash = pTempTChar = pChar + 2; *++pTempTChar; )
								if ( *pTempTChar == '\\' )
									pLastBackSlash = pTempTChar;
							if ( ++pLastBackSlash == pTempTChar || (((m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) == CParsedPathItemA::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return EXCLUDE_ITEM;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItemA::INTERMEDIA_ITEM:
						break;
					default:
						return EXCLUDE_ITEM;
					}
					if ( pcsFilePathname[1] != ':' || pcsFilePathname[2] != '\\' )
						return EXCLUDE_ITEM;
					else if ( *pcsFilePathname >= 'A' && *pcsFilePathname <= 'Z' )
						nDrive = *pcsFilePathname - 'A';
					else if ( *pcsFilePathname >= 'a' && *pcsFilePathname <= 'z' )
						nDrive = *pcsFilePathname - 'a';
					else
						return EXCLUDE_ITEM;
					pItem = m_pFirstChild;
					while ( pItem && (int)pItem->m_psName < nDrive )
						pItem = pItem->m_pNextSibling;
					if ( !pItem || (int)pItem->m_psName != nDrive )
						return fInclude ? INCLUDE_ITEM : INTERMEDIA_ITEM;
					pChar += 3;
				}

				while ( 1 )
				{
					switch ( pItem->m_dwFlags & CParsedPathItemA::ITEM_TYPE_MASK )
					{
					case CParsedPathItemA::INCLUDE_ITEM:
						if ( pItem->m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributesA(pcsFilePathname);

							if ( (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (((pItem->m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK) == CParsedPathItemA::INCLUDE_FILE_ATTRIBUTES_MASK ? TRUE : FALSE) ^ (pItem->m_dwFileAttributesMask & dwFileAttributes)) )
								return EXCLUDE_ITEM;
						}
						if ( (pItem->m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) && pItem->m_pFilenameMaskList )
						{
							LPCSTR pLastBackSlash, pTempTChar;

							for ( pLastBackSlash = pTempTChar = pChar; *pTempTChar; pTempTChar++ )
								if ( *pTempTChar == '\\' )
									pLastBackSlash = pTempTChar;
							if ( ++pLastBackSlash == pTempTChar || (((pItem->m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) == CParsedPathItemA::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ pItem->m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return EXCLUDE_ITEM;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItemA::INTERMEDIA_ITEM:
						break;
					default:
						return EXCLUDE_ITEM;
					}
					nLen = 0;
					while ( *pChar != NULL && *pChar != '\\' )
						sPathName[nLen++] = LOWER(*pChar++);
					sPathName[nLen] = NULL;
					pItem = pItem->m_pFirstChild;
					nCompare = -1;
					while ( pItem != NULL && (nLen != pItem->m_nNameLength || (nCompare = ::strncmp(pItem->m_psName, sPathName, nLen)) < 0) )
						pItem = pItem->m_pNextSibling;
					if ( !pItem || nCompare != 0 )
						return fInclude ? INCLUDE_ITEM : INTERMEDIA_ITEM;
					pChar++;
				}
			}
			inline PARSED_PATH_ITEM_FLAGS_BIT_MASK MatchFilePathname(LPCWSTR pcwsFilePathname, CParsedPathItemA*& pItem)
			{
				char sFilePathname[MAX_PATH * 2];

				if ( ::WideCharToMultiByte(CFileBackup::GetCodePage(), 0, pcwsFilePathname, -1, sFilePathname, sizeof(sFilePathname), NULL, NULL) == 0 )
					return EXCLUDE_ITEM;
				else
					return MatchFilePathname(sFilePathname, pItem);
			}

			inline BOOL MatchFilePathname(LPCSTR pcsFilePathname)
			{
				CParsedPathItemA* pItem;
				LPCSTR pChar = pcsFilePathname;
				BOOL fInclude = FALSE;
				CHAR sPathName[MAX_PATH];
				int nLen;
				int nCompare;

				if ( (m_dwFlags & CParsedPathItemA::ITEM_MASK) == CParsedPathItemA::ROOT_ITEM )
				{
					int nDrive;

					switch ( m_dwFlags & CParsedPathItemA::ITEM_TYPE_MASK )
					{
					case CParsedPathItemA::INCLUDE_ITEM:
						if ( m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributesA(pcsFilePathname);

							if ( (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (((m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK) == CParsedPathItemA::INCLUDE_FILE_ATTRIBUTES_MASK ? TRUE : FALSE) ^ (m_dwFileAttributesMask & dwFileAttributes)) )
								return FALSE;
						}
						if ( (m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) && m_pFilenameMaskList )
						{
							LPCSTR pLastBackSlash, pTempTChar;

							for ( pLastBackSlash = pTempTChar = pChar + 2; *++pTempTChar; )
								if ( *pTempTChar == '\\' )
									pLastBackSlash = pTempTChar;
							if ( ++pLastBackSlash == pTempTChar || (((m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) == CParsedPathItemA::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return FALSE;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItemA::INTERMEDIA_ITEM:
						break;
					default:
						return FALSE;
					}
					if ( pcsFilePathname[1] != ':' || pcsFilePathname[2] != '\\' )
						return FALSE;
					else if ( *pcsFilePathname >= 'A' && *pcsFilePathname <= 'Z' )
						nDrive = *pcsFilePathname - 'A';
					else if ( *pcsFilePathname >= 'a' && *pcsFilePathname <= 'z' )
						nDrive = *pcsFilePathname - 'a';
					else
						return FALSE;
					pItem = m_pFirstChild;
					while ( pItem && (int)pItem->m_psName < nDrive )
						pItem = pItem->m_pNextSibling;
					if ( !pItem || (int)pItem->m_psName != nDrive )
						return fInclude;
					pChar += 3;
				}
				else
					pItem = this;

				while ( 1 )
				{
					switch ( pItem->m_dwFlags & CParsedPathItemA::ITEM_TYPE_MASK )
					{
					case CParsedPathItemA::INCLUDE_ITEM:
						if ( pItem->m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributesA(pcsFilePathname);

							if ( (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (((pItem->m_dwFlags & CParsedPathItemA::FILE_ATTRIBUTES_MASK_MASK) == CParsedPathItemA::INCLUDE_FILE_ATTRIBUTES_MASK ? TRUE : FALSE) ^ (pItem->m_dwFileAttributesMask & dwFileAttributes)) )
								return FALSE;
						}
						if ( (pItem->m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) && pItem->m_pFilenameMaskList )
						{
							LPCSTR pLastBackSlash, pTempTChar;

							for ( pLastBackSlash = pTempTChar = pChar; *pTempTChar; pTempTChar++ )
								if ( *pTempTChar == '\\' )
									pLastBackSlash = pTempTChar;
							if ( ++pLastBackSlash == pTempTChar || (((pItem->m_dwFlags & CParsedPathItemA::FILENAME_MASK_MASK) == CParsedPathItemA::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ pItem->m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return FALSE;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItemA::INTERMEDIA_ITEM:
						break;
					default:
						return FALSE;
					}
					nLen = 0;
					while ( *pChar && *pChar != '\\' )
						sPathName[nLen++] = LOWER(*pChar++);
					sPathName[nLen] = NULL;
					pItem = pItem->m_pFirstChild;
					nCompare = -1;
					while ( pItem && (nLen != pItem->m_nNameLength || (nCompare = ::strncmp(pItem->m_psName, sPathName, nLen)) < 0) )
						pItem = pItem->m_pNextSibling;
					if ( !pItem || nCompare != 0 )
						return fInclude;
					pChar++;
				}
			}
			inline BOOL MatchFilePathname(LPCWSTR pcwsFilePathname)
			{
				char sFilePathname[MAX_PATH * 2];

				if ( ::WideCharToMultiByte(CFileBackup::GetCodePage(), 0, pcwsFilePathname, -1, sFilePathname, sizeof(sFilePathname), NULL, NULL) == 0 )
					return FALSE;
				else
					return MatchFilePathname(sFilePathname);
			}

			void GetIncludeItems(CList<CParsedPathItemA*, CParsedPathItemA*>& objList)
			{
				if ( (m_dwFlags & ITEM_TYPE_MASK) == INCLUDE_ITEM )
					objList.AddTail(this);
				else if ( m_pFirstChild != NULL )
					m_pFirstChild->GetIncludeItems(objList);
				if ( m_pNextSibling != NULL )
					m_pNextSibling->GetIncludeItems(objList);
			}

/*
			inline CString GetItemFullPath()
			{
				CString csPath;
				CParsedPathItemA* pTempItem = this;
				int nLen = 0;
				LPTSTR pts;

				while ( !pTempItem->IsRootItem() )
				{
					nLen += pTempItem->GetItemStringLength() + 1;
					pTempItem = pTempItem->m_pParent;
				}
				nLen -= 2;
				if ( nLen <= 0 )
					return csPath;
				pts = csPath.GetBuffer(nLen) + nLen;
				pTempItem = this;
				while ( !pTempItem->IsRootItem() )
				{
					if ( pTempItem->IsNormalItem() )
					{
						pts -= (DWORD)*(pTempItem->m_ptsName - 1);
						_tcscpy(pts, pTempItem->m_ptsName);
						*--pts = _T('\\');
					}
					else
					{
						*--pts = _T(':');
						*--pts = (TCHAR)(_T('a') + (int)pTempItem->m_ptsName);
					}
					pTempItem = pTempItem->m_pParent;
				}
				csPath.ReleaseBuffer(nLen);
				if ( nLen < 3 )
					csPath += _T('\\');
				return csPath;
			}
*/

			inline BOOL GetItemFullPath(LPSTR pPath, int nMax)
			{
				CParsedPathItemA* pTempItem = this;
				int nLen = 0;
				LPSTR ps;

				while ( !pTempItem->IsRootItem() )
				{
					nLen += pTempItem->IsDriveItem() ? 2 : pTempItem->m_nNameLength + 1;
					pTempItem = pTempItem-

⌨️ 快捷键说明

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