377 lines
5.2 KiB
C++
377 lines
5.2 KiB
C++
|
#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();
|
||
|
}
|