📄 simplefilebackup.h
字号:
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;
pTChar++;
}
}
inline BOOL MatchFilePathname(LPCTSTR pctsFilePathname, DWORD dwFileAttributes)
{
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 )
{
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 )
{
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;
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;
pTChar++;
}
}
inline PARSED_PATH_ITEM_FLAGS_BIT_MASK MatchDirectory(LPCTSTR pctsDirectory, CParsedPathItem*& pIncludeItem)
{
CParsedPathItem* pItem;
LPCTSTR pTChar = pctsDirectory;
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:
fInclude = TRUE;
pIncludeItem = pItem;
break;
case CParsedPathItem::INTERMEDIA_ITEM:
break;
default:
return EXCLUDE_ITEM;
}
if ( pctsDirectory[1] != _T(':') || pctsDirectory[2] != _T('\\') )
return EXCLUDE_ITEM;
else if ( *pctsDirectory >= _T('A') && *pctsDirectory <= _T('Z') )
nDrive = *pctsDirectory - _T('A');
else if ( *pctsDirectory >= _T('a') && *pctsDirectory <= _T('z') )
nDrive = *pctsDirectory - _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:
fInclude = TRUE;
pIncludeItem = pItem;
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 MatchDirectory(LPCTSTR pctsDirectory)
{
CParsedPathItem* pItem;
LPCTSTR pTChar = pctsDirectory;
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:
fInclude = TRUE;
break;
case CParsedPathItem::INTERMEDIA_ITEM:
break;
default:
return EXCLUDE_ITEM;
}
if ( pctsDirectory[1] != _T(':') || pctsDirectory[2] != _T('\\') )
return EXCLUDE_ITEM;
else if ( *pctsDirectory >= _T('A') && *pctsDirectory <= _T('Z') )
nDrive = *pctsDirectory - _T('A');
else if ( *pctsDirectory >= _T('a') && *pctsDirectory <= _T('z') )
nDrive = *pctsDirectory - _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;
}
else
pItem = this;
while ( 1 )
{
switch ( pItem->m_dwFlags & CParsedPathItem::ITEM_TYPE_MASK )
{
case CParsedPathItem::INCLUDE_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++;
}
}
void GetIncludeItems(CList<CParsedPathItem*, CParsedPathItem*>& objList)
{
switch ( m_dwFlags & ITEM_TYPE_MASK )
{
case INCLUDE_ITEM:
objList.AddTail(this);
if ( m_pNextSibling != NULL )
m_pNextSibling->GetIncludeItems(objList);
break;
case INTERMEDIA_ITEM:
if ( m_pFirstChild != NULL )
m_pFirstChild->GetIncludeItems(objList);
if ( m_pNextSibling != NULL )
m_pNextSibling->GetIncludeItems(objList);
}
}
void GetIncludeItems(CStringList& objStringList)
{
switch ( m_dwFlags & ITEM_TYPE_MASK )
{
case INCLUDE_ITEM:
objStringList.AddTail(GetItemFullPath());
if ( m_pNextSibling != NULL )
m_pNextSibling->GetIncludeItems(objStringList);
break;
case INTERMEDIA_ITEM:
if ( m_pFirstChild != NULL )
m_pFirstChild->GetIncludeItems(objStringList);
if ( m_pNextSibling != NULL )
m_pNextSibling->GetIncludeItems(objStringList);
}
}
void GetIncludeItems(CStringList& objStringList, CList<CParsedPathItem*, CParsedPathItem*>& objList)
{
switch ( m_dwFlags & ITEM_TYPE_MASK )
{
case INCLUDE_ITEM:
objList.AddTail(this);
objStringList.AddTail(GetItemFullPath());
if ( m_pNextSibling != NULL )
m_pNextSibling->GetIncludeItems(objStringList, objList);
break;
case INTERMEDIA_ITEM:
if ( m_pFirstChild != NULL )
m_pFirstChild->GetIncludeItems(objStringList, objList);
if ( m_pNextSibling != NULL )
m_pNextSibling->GetIncludeItems(objStringList, objList);
}
}
inline CString GetItemFullPath()
{
CString csPath;
CParsedPathItem* 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);
::memcpy(pts, pTempItem->m_ptsName, (DWORD)*(pTempItem->m_ptsName - 1) * sizeof(TCHAR));
*--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 void GetItemFullPath(LPTSTR pPath)
{
CParsedPathItem* pTempItem = this;
int nLen = 0;
LPTSTR pts;
while ( !pTempItem->IsRootItem() )
{
nLen += pTempItem->GetItemStringLength() + 1;
pTempItem = pTempItem->m_pParent;
}
if ( --nLen <= 0 )
{
*pPath = NULL;
return;
}
pts = pPath + nLen;
*pts = NULL;
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);
}
ASSERT(pts == pPath);
}
inline DWORD GetItemStringLength() const
{
switch ( m_dwFlags & ITEM_MASK )
{
case ROOT_ITEM:
return 0;
case DRIVE_ITEM:
return 3;
case DIRECTORY_OR_FILE_ITEM:
return (DWORD)*(m_ptsName - 1);
default:
return 0;
}
}
inline BOOL IsRootItem() const { return (m_dwFlags & ITEM_MASK) == ROOT_ITEM ? TRUE : FALSE; }
inline BOOL IsDriveItem() const { return (m_dwFlags & ITEM_MASK) == DRIVE_ITEM ? TRUE : FALSE; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -