|
|
#include "pch.h"
#pragma hdrstop
#include "pathstr.h"
CPath::CPath( LPCTSTR pszRoot, LPCTSTR pszDir, LPCTSTR pszFile, LPCTSTR pszExt ) { if (pszDir) SetPath(pszDir); if (pszRoot) SetRoot(pszRoot); if (pszFile) SetFileSpec(pszFile); if (pszExt) SetExtension(pszExt); }
CPath::CPath( const CPath& rhs ) : CString(rhs) {
}
CPath& CPath::operator = ( const CPath& rhs ) { if (this != &rhs) { CString::operator = (rhs); } return *this; }
CPath& CPath::operator = ( LPCTSTR rhs ) { CString::operator = (rhs); return *this; }
void CPath::AddBackslash( void ) { ::PathAddBackslash(GetBuffer(MAX(MAX_PATH, Length() + 2))); ReleaseBuffer(); }
void CPath::RemoveBackslash( void ) { ::PathRemoveBackslash(GetBuffer()); ReleaseBuffer(); }
bool CPath::GetRoot( CPath *pOut ) const { CPath temp(*this); temp.StripToRoot(); *pOut = temp; return 0 < pOut->Length(); }
bool CPath::GetPath( CPath *pOut ) const { CPath temp(*this); temp.RemoveFileSpec(); *pOut = temp; return 0 < pOut->Length(); }
bool CPath::GetDirectory( CPath *pOut ) const { if (GetPath(pOut)) pOut->RemoveRoot();
return 0 < pOut->Length(); }
bool CPath::GetExtension( CPath *pOut ) const { *pOut = ::PathFindExtension(*this); return 0 < pOut->Length(); }
bool CPath::GetFileSpec( CPath *pOut ) const { *pOut = ::PathFindFileName(*this); return 0 < pOut->Length(); }
bool CPath::Append( LPCTSTR psz ) { bool bResult = boolify(::PathAppend(GetBuffer(MAX(MAX_PATH, Length() + lstrlen(psz) + 3)), psz)); ReleaseBuffer(); return bResult; }
bool CPath::BuildRoot( int iDrive ) { Empty(); bool bResult = NULL != ::PathBuildRoot(GetBuffer(5), iDrive); ReleaseBuffer(); return bResult; }
bool CPath::Canonicalize( void ) { CString strTemp(*this); bool bResult = boolify(::PathCanonicalize(GetBuffer(MAX(MAX_PATH, Size())), strTemp)); ReleaseBuffer(); return bResult; }
bool CPath::Compact( HDC hdc, int cxPixels ) { bool bResult = boolify(::PathCompactPath(hdc, GetBuffer(), cxPixels)); ReleaseBuffer(); return bResult; }
bool CPath::CommonPrefix( LPCTSTR pszPath1, LPCTSTR pszPath2 ) { Empty(); ::PathCommonPrefix(pszPath1, pszPath2, GetBuffer(MAX(MAX_PATH, (MAX(lstrlen(pszPath1), lstrlen(pszPath2)) + 1)))); ReleaseBuffer(); return 0 < Length(); }
void CPath::QuoteSpaces( void ) { ::PathQuoteSpaces(GetBuffer(MAX(MAX_PATH, Length() + 3))); ReleaseBuffer(); }
void CPath::UnquoteSpaces( void ) { ::PathUnquoteSpaces(GetBuffer()); ReleaseBuffer(); }
void CPath::RemoveBlanks( void ) { ::PathRemoveBlanks(GetBuffer()); ReleaseBuffer(); }
void CPath::RemoveExtension( void ) { PathRemoveExtension(GetBuffer()); ReleaseBuffer(); }
void CPath::RemoveFileSpec( void ) { ::PathRemoveFileSpec(GetBuffer()); ReleaseBuffer(); }
void CPath::RemoveRoot( void ) { LPTSTR psz = ::PathSkipRoot(*this); if (psz) { CPath temp(psz); *this = temp; } }
void CPath::RemovePath( void ) { CPath temp; GetFileSpec(&temp); *this = temp; }
void CPath::StripToRoot( void ) { ::PathStripToRoot(GetBuffer()); ReleaseBuffer(); }
void CPath::SetRoot( LPCTSTR pszRoot ) { CPath strTemp(*this); strTemp.RemoveRoot(); *this = pszRoot; Append(strTemp); }
void CPath::SetPath( LPCTSTR pszPath ) { CPath strTemp(*this); *this = pszPath;
strTemp.RemovePath(); Append(strTemp); }
void CPath::SetDirectory( LPCTSTR pszDir ) { CPath path; GetPath(&path); path.StripToRoot(); path.AddBackslash(); path.Append(pszDir); SetPath(path); }
void CPath::SetFileSpec( LPCTSTR pszFileSpec ) { RemoveFileSpec(); Append(pszFileSpec); }
void CPath::SetExtension( LPCTSTR pszExt ) { ::PathRenameExtension(GetBuffer(MAX(MAX_PATH, Length() + lstrlen(pszExt) + 2)), pszExt); ReleaseBuffer(); }
CPathIter::CPathIter( const CPath& path ) : m_path(path), m_pszCurrent((LPTSTR)m_path.Cstr()) { //
// Skip over leading whitespace and backslashes.
//
while(*m_pszCurrent && (TEXT('\\') == *m_pszCurrent || TEXT(' ') == *m_pszCurrent || TEXT('\t') == *m_pszCurrent || TEXT('\n') == *m_pszCurrent)) { m_pszCurrent++; } }
bool CPathIter::Next( CPath *pOut ) { DBGASSERT((NULL != pOut));
LPCTSTR pszStart = m_pszCurrent; if (NULL == pszStart || TEXT('\0') == *pszStart) return false;
TCHAR chTemp = TEXT('\0'); m_pszCurrent = ::PathFindNextComponent(pszStart); if (NULL != m_pszCurrent && *m_pszCurrent) SWAP(*(m_pszCurrent - 1), chTemp);
*pOut = pszStart;
if (TEXT('\0') != chTemp) SWAP(*(m_pszCurrent - 1), chTemp);
return true; }
void CPathIter::Reset( void ) { m_pszCurrent = (LPTSTR)m_path.Cstr(); }
|