📄 filebackupe.h
字号:
return IsSubNameMatchWithoutDot(pMask, pName);
else if ( *pMask != *pName )
return *pName == NULL && *pMask == _T('.') && *(pMask + 1) == NULL;
pName++;
pMask++;
}
return *pName == NULL; // *pMask == NULL
}
}
}
inline const CString& GetMask() const { return m_csMask; }
inline FILE_MASK_TYPE GetMaskType() const { return m_enumType; }
inline int GetMaskLen() const { return m_nMaskLen; }
inline int GetNameRequiredLen() const { return m_nRequiredLen; }
inline BOOL IsMaskType(FILE_MASK_TYPE type) const { return m_enumType == type; }
protected:
CString m_csMask;
FILE_MASK_TYPE m_enumType;
int m_nMaskLen;
int m_nRequiredLen;
};
inline CFilenameMaskList() {}
inline CFilenameMaskList(LPCTSTR pcstrMasks) { *this = pcstrMasks; }
inline void Reset() { RemoveAll(); }
inline CFilenameMaskList& operator =(LPCTSTR pcstrMasks)
{
LPCTSTR pChar = pcstrMasks;
LPCTSTR pStartPos = pcstrMasks;
int nTokenLen = 0;
CString csMask;
LPTSTR pBuf;
BOOL fIsQuotationMask = FALSE;
m_clMaskList.RemoveAll();
while ( *pChar != NULL )
{
if ( fIsQuotationMask )
{
if ( *pChar == _T('"') )
{
if ( nTokenLen > 0 )
{
pBuf = csMask.GetBuffer(nTokenLen);
memcpy(pBuf, pStartPos, nTokenLen * sizeof(TCHAR));
csMask.ReleaseBuffer(nTokenLen);
Add(csMask);
}
pStartPos = pChar + 1;
nTokenLen = 0;
fIsQuotationMask = FALSE;
}
else
nTokenLen++;
}
else
{
switch ( *pChar )
{
case _T('"'):
fIsQuotationMask = TRUE;
case _T(';'):
if ( nTokenLen > 0 )
{
pBuf = csMask.GetBuffer(nTokenLen);
memcpy(pBuf,pStartPos, nTokenLen * sizeof(TCHAR));
csMask.ReleaseBuffer(nTokenLen);
Add(csMask);
}
pStartPos = pChar + 1;
nTokenLen = 0;
break;
default:
nTokenLen++;
}
}
pChar++;
}
if ( nTokenLen > 0 )
{
pBuf = csMask.GetBuffer(nTokenLen);
memcpy(pBuf, pStartPos, nTokenLen * sizeof(TCHAR));
csMask.ReleaseBuffer(nTokenLen);
Add(csMask);
}
return *this;
}
inline CString WriteToString () const
{
CString csMasks;
POSITION pos;
BOOL fFirstMask;
PTSTR pBuf;
int nBufLen = 0;
pos = m_clMaskList.GetHeadPosition();
fFirstMask = TRUE;
while ( pos )
{
CFilenameMask& mask = m_clMaskList.GetNext(pos);
if ( fFirstMask )
fFirstMask = FALSE;
else
nBufLen++;
switch ( mask.GetMaskType() )
{
case CFilenameMask::SYNC_FILE_MASK_TYPE_ALL:
nBufLen += 3;
break;
case CFilenameMask::SYNC_FILE_MASK_TYPE_EXT:
nBufLen += mask.GetMaskLen() + (mask.GetMask().Find(_T(';')) != -1 ? 4 : 2);
break;
default:
nBufLen += mask.GetMaskLen();
if ( mask.GetMask().Find(_T(';')) != -1 )
nBufLen += 2;
}
}
pos = m_clMaskList.GetHeadPosition();
fFirstMask = TRUE;
pBuf = csMasks.GetBuffer(nBufLen);
while ( pos )
{
CFilenameMask& mask = m_clMaskList.GetNext(pos);
if ( fFirstMask )
fFirstMask = FALSE;
else
*pBuf++ = _T(';');
switch ( mask.GetMaskType() )
{
case CFilenameMask::SYNC_FILE_MASK_TYPE_ALL:
*pBuf++ = _T('*');
*pBuf++ = _T('.');
*pBuf++ = _T('*');
break;
case CFilenameMask::SYNC_FILE_MASK_TYPE_EXT:
if ( mask.GetMask().Find(_T(';')) != -1 )
{
LPCTSTR pTChar = (LPCTSTR)mask.GetMask();
*pBuf++ = _T('"');
*pBuf++ = _T('*');
*pBuf++ = _T('.');
while ( *pTChar )
*pBuf++ = *pTChar++;
*pBuf++ = _T('"');
}
else
{
LPCTSTR pTChar = (LPCTSTR)mask.GetMask();
*pBuf++ = _T('*');
*pBuf++ = _T('.');
while ( *pTChar )
*pBuf++ = *pTChar++;
}
break;
default:
if ( mask.GetMask().Find(_T(';')) != -1 )
{
LPCTSTR pTChar = (LPCTSTR)mask.GetMask();
*pBuf++ = _T('"');
while ( *pTChar )
*pBuf++ = *pTChar++;
*pBuf++ = _T('"');
}
else
{
LPCTSTR pTChar = (LPCTSTR)mask.GetMask();
while ( *pTChar )
*pBuf++ = *pTChar++;
}
}
}
csMasks.ReleaseBuffer(nBufLen);
return csMasks;
}
inline BOOL operator ==(CFilenameMaskList& objMaskList) const
{
POSITION pos1 = m_clMaskList.GetHeadPosition(), pos2 = objMaskList.m_clMaskList.GetHeadPosition();
while ( pos1 && pos2 )
{
CFilenameMask &mask1 = m_clMaskList.GetNext(pos1), &mask2 = objMaskList.m_clMaskList.GetNext(pos2);
if ( mask1 != mask2 )
return FALSE;
}
return pos1 == pos2;
}
inline BOOL operator ==(LPCTSTR pcstrMasks) const
{
return *this == CFilenameMaskList(pcstrMasks);
}
inline BOOL operator !=(CFilenameMaskList& objMaskList) const
{
return !(operator ==(objMaskList));
}
inline BOOL operator !=(LPCTSTR pcstrMasks) const
{
return *this != CFilenameMaskList(pcstrMasks);
}
inline void Add(LPCTSTR pcstrMask)
{
CString csTempMask(CFilenameMask::CleanMask(pcstrMask));
POSITION pos = m_clMaskList.GetHeadPosition(), posPrev;
while ( (posPrev = pos) )
{
CFilenameMask& mask = m_clMaskList.GetNext(pos);
int nCompare = mask.Compare(csTempMask);
switch ( nCompare )
{
case 1:
m_clMaskList.InsertBefore(posPrev, CFilenameMask(csTempMask));
case 0:
return;
}
}
m_clMaskList.AddTail(CFilenameMask(csTempMask));
}
inline void Remove(LPCTSTR pcstrMask)
{
CString csTempMask(CFilenameMask::CleanMask(pcstrMask));
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)
{
// 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 == 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 == 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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -