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

📄 simplefilebackup.h

📁 实时文件备份
💻 H
📖 第 1 页 / 共 5 页
字号:
			POSITION pos = m_clMaskList.GetHeadPosition(), posPrev;

			while ( (posPrev = pos) )
			{
				CFilenameMask& mask = m_clMaskList.GetNext(pos);
				int nCompare = mask.Compare(csTempMask);

				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 )
			{
				CFilenameMask& mask = m_clMaskList.GetNext(pos);
				if ( mask == pcstrMask )
					return TRUE;
			}
			return FALSE;
		}

		inline BOOL IsNameMatch(LPCTSTR pcstrName) const
		{
			POSITION pos = m_clMaskList.GetHeadPosition();

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

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

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

	class CFileFilter
	{
	public:
		class CParsedPathItem
		{
		public:
			friend class CFileFilter;

			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 CParsedPathItem(LPCTSTR pctsItemName, LPCTSTR pctsFilenameMask, DWORD dwFileAttributesMask, DWORD dwFlags) : m_pParent(NULL), m_pFirstChild(NULL), m_pNextSibling(NULL), m_dwFlags(0), m_ptsName(NULL), m_pFilenameMaskList(NULL), m_dwFileAttributesMask(0)
			{
				SetItemData(pctsItemName, pctsFilenameMask, dwFileAttributesMask, dwFlags);
			}

			inline CParsedPathItem(CParsedPathItem* pParent, LPCTSTR pctsItemName, LPCTSTR pctsFilenameMask, DWORD dwFileAttributesMask, DWORD dwFlags) : m_pParent(NULL), m_pFirstChild(NULL), m_pNextSibling(NULL), m_dwFlags(0), m_ptsName(NULL), m_pFilenameMaskList(NULL), m_dwFileAttributesMask(0)
			{
				SetItemData(pctsItemName, pctsFilenameMask, dwFileAttributesMask, dwFlags);
				m_pParent = pParent;
			}

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

			BOOL AddIncludePath(LPCTSTR pctsPath, LPCTSTR pctsFilenameMask, BOOL fIsIncludeFilenameMask, DWORD* pdwFileAttributesMask, BOOL fIsIncludeFileAttributesMask);
			BOOL AddExcludePath(LPCTSTR pctsPath, BOOL fUnderIncludePath);

			inline PARSED_PATH_ITEM_FLAGS_BIT_MASK MatchFilePathname(LPCTSTR pctsFilePathname, CParsedPathItem*& pItem)
			{
				LPCTSTR pTChar = pctsFilePathname;
				BOOL fInclude = FALSE;
				TCHAR tsPathName[MAX_PATH];
				int nLen;
				int nCompare;

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

					switch ( m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
					{
					case CParsedPathItem::INCLUDE_ITEM:
						if ( m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributes(pctsFilePathname);

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

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

				while ( 1 )
				{
					switch ( pItem->m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
					{
					case CParsedPathItem::INCLUDE_ITEM:
						if ( pItem->m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributes(pctsFilePathname);

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

							for ( pLastBackSlash = pTempTChar = pTChar; *pTempTChar; pTempTChar++ )
								if ( *pTempTChar == _T('\\') )
									pLastBackSlash = pTempTChar;
							if ( *pLastBackSlash == _T('\\') )
								pLastBackSlash++;
							if ( pLastBackSlash == pTempTChar || (((pItem->m_dwFlags & CParsedPathItem::FILENAME_MASK_MASK) == CParsedPathItem::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ pItem->m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return EXCLUDE_ITEM;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItem::INTERMEDIA_ITEM:
						break;
					default:
						return EXCLUDE_ITEM;
					}
					nLen = 0;
					if ( *pTChar == _T('\\') )
						*pTChar++;
					while ( *pTChar && *pTChar != _T('\\') )
						tsPathName[nLen++] = LOWER(*pTChar++);
					tsPathName[nLen] = NULL;
					pItem = pItem->m_pFirstChild;
					nCompare = -1;
					while ( pItem && (nLen != *(pItem->m_ptsName - 1) || (nCompare = _tcsncmp(pItem->m_ptsName, tsPathName, nLen)) < 0) )
						pItem = pItem->m_pNextSibling;
					if ( !pItem || nCompare != 0 )
						return fInclude ? INCLUDE_ITEM : INTERMEDIA_ITEM;
					pTChar++;
				}
			}

			inline PARSED_PATH_ITEM_FLAGS_BIT_MASK MatchFilePathname(LPCTSTR pctsFilePathname, DWORD dwFileAttributes, CParsedPathItem*& pItem)
			{
				LPCTSTR pTChar = pctsFilePathname;
				BOOL fInclude = FALSE;
				TCHAR tsPathName[MAX_PATH];
				int nLen;
				int nCompare;

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

					switch ( m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
					{
					case CParsedPathItem::INCLUDE_ITEM:
						if ( m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK )
						{
							if ( (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (((m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK) == CParsedPathItem::INCLUDE_FILE_ATTRIBUTES_MASK ? TRUE : FALSE) ^ (m_dwFileAttributesMask & dwFileAttributes)) )
								return EXCLUDE_ITEM;
						}
						if ( (m_dwFlags & CParsedPathItem::FILENAME_MASK_MASK) && m_pFilenameMaskList )
						{
							LPCTSTR pLastBackSlash, pTempTChar;

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

				while ( 1 )
				{
					switch ( pItem->m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
					{
					case CParsedPathItem::INCLUDE_ITEM:
						if ( pItem->m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK )
						{
							if ( (dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || (((pItem->m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK) == CParsedPathItem::INCLUDE_FILE_ATTRIBUTES_MASK ? TRUE : FALSE) ^ (pItem->m_dwFileAttributesMask & dwFileAttributes)) )
								return EXCLUDE_ITEM;
						}
						if ( (pItem->m_dwFlags & CParsedPathItem::FILENAME_MASK_MASK) && pItem->m_pFilenameMaskList )
						{
							LPCTSTR pLastBackSlash, pTempTChar;

							for ( pLastBackSlash = pTempTChar = pTChar; *pTempTChar; pTempTChar++ )
								if ( *pTempTChar == _T('\\') )
									pLastBackSlash = pTempTChar;
							if ( *pLastBackSlash == _T('\\') )
								pLastBackSlash++;
							if ( pLastBackSlash == pTempTChar || (((pItem->m_dwFlags & CParsedPathItem::FILENAME_MASK_MASK) == CParsedPathItem::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ pItem->m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return EXCLUDE_ITEM;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItem::INTERMEDIA_ITEM:
						break;
					default:
						return EXCLUDE_ITEM;
					}
					nLen = 0;
					if ( *pTChar == _T('\\') )
						*pTChar++;
					while ( *pTChar && *pTChar != _T('\\') )
						tsPathName[nLen++] = LOWER(*pTChar++);
					tsPathName[nLen] = NULL;
					pItem = pItem->m_pFirstChild;
					nCompare = -1;
					while ( pItem && (nLen != *(pItem->m_ptsName - 1) || (nCompare = _tcsncmp(pItem->m_ptsName, tsPathName, nLen)) < 0) )
						pItem = pItem->m_pNextSibling;
					if ( !pItem || nCompare != 0 )
						return fInclude ? INCLUDE_ITEM : INTERMEDIA_ITEM;
					pTChar++;
				}
			}

			inline BOOL MatchFilePathname(LPCTSTR pctsFilePathname)
			{
				CParsedPathItem* pItem;
				LPCTSTR pTChar = pctsFilePathname;
				BOOL fInclude = FALSE;
				TCHAR tsPathName[MAX_PATH];
				int nLen;
				int nCompare;

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

					switch ( m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
					{
					case CParsedPathItem::INCLUDE_ITEM:
						if ( m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributes(pctsFilePathname);

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

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

				while ( 1 )
				{
					switch ( pItem->m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
					{
					case CParsedPathItem::INCLUDE_ITEM:
						if ( pItem->m_dwFlags & CParsedPathItem::FILE_ATTRIBUTES_MASK_MASK )
						{
							DWORD dwFileAttributes = ::GetFileAttributes(pctsFilePathname);

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

							for ( pLastBackSlash = pTempTChar = pTChar; *pTempTChar; pTempTChar++ )
								if ( *pTempTChar == _T('\\') )
									pLastBackSlash = pTempTChar;
							if ( *pLastBackSlash == _T('\\') )
								pLastBackSlash++;
							if ( pLastBackSlash == pTempTChar || (((pItem->m_dwFlags & CParsedPathItem::FILENAME_MASK_MASK) == CParsedPathItem::INCLUDE_FILENAME_MASK ? TRUE : FALSE) ^ pItem->m_pFilenameMaskList->IsNameMatch(pLastBackSlash)) )
								return FALSE;
						}
						fInclude = TRUE;
						break;
					case CParsedPathItem::INTERMEDIA_ITEM:
						break;
					default:
						return FALSE;
					}
					nLen = 0;

⌨️ 快捷键说明

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