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