174 lines
3.8 KiB
C++
174 lines
3.8 KiB
C++
|
/*
|
||
|
* (C) 1997, 2006 Mike Crowe
|
||
|
*
|
||
|
* License: Do what you like with it except claim that you wrote it.
|
||
|
*/
|
||
|
|
||
|
#include "stdafx.h"
|
||
|
#include "dospath.h"
|
||
|
#include <stdlib.h>
|
||
|
#include <direct.h>
|
||
|
|
||
|
CDosPath::CDosPath(const TCHAR *pszPath, int nFlags)
|
||
|
{
|
||
|
SetPath(pszPath, nFlags);
|
||
|
}
|
||
|
|
||
|
CDosPath::CDosPath(const CDosPath &old)
|
||
|
{
|
||
|
m_drive = old.m_drive;
|
||
|
m_dir = old.m_dir;
|
||
|
m_file = old.m_file;
|
||
|
m_ext = old.m_ext;
|
||
|
}
|
||
|
|
||
|
CDosPath &CDosPath::operator=(const CDosPath &old)
|
||
|
{
|
||
|
m_drive = old.m_drive;
|
||
|
m_dir = old.m_dir;
|
||
|
m_file = old.m_file;
|
||
|
m_ext = old.m_ext;
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
CDosPath::~CDosPath()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CDosPath::SplitPath(const TCHAR *path)
|
||
|
{
|
||
|
#if USE_SECURE
|
||
|
_tsplitpath_s(path, m_drive.GetBufferSetLength(_MAX_DRIVE), _MAX_DRIVE,
|
||
|
m_dir.GetBufferSetLength(_MAX_DIR), _MAX_DIR,
|
||
|
m_file.GetBufferSetLength(_MAX_FNAME), _MAX_FNAME,
|
||
|
m_ext.GetBufferSetLength(_MAX_EXT), _MAX_EXT);
|
||
|
#else
|
||
|
_tsplitpath(path, m_drive.GetBufferSetLength(_MAX_DRIVE),
|
||
|
m_dir.GetBufferSetLength(_MAX_DIR),
|
||
|
m_file.GetBufferSetLength(_MAX_FNAME),
|
||
|
m_ext.GetBufferSetLength(_MAX_EXT));
|
||
|
#endif
|
||
|
|
||
|
m_ext.ReleaseBuffer();
|
||
|
m_file.ReleaseBuffer();
|
||
|
m_dir.ReleaseBuffer();
|
||
|
m_drive.ReleaseBuffer();
|
||
|
}
|
||
|
|
||
|
void CDosPath::SetPath(const TCHAR *pszPath, int nFlags)
|
||
|
{
|
||
|
if (nFlags & PATH_ONLY)
|
||
|
{
|
||
|
CString temp(pszPath);
|
||
|
temp += '\\';
|
||
|
SplitPath(temp);
|
||
|
}
|
||
|
else
|
||
|
SplitPath(pszPath);
|
||
|
}
|
||
|
|
||
|
CDosPath &CDosPath::operator|=(CDosPath &fullpath)
|
||
|
{
|
||
|
if (m_drive.IsEmpty())
|
||
|
{
|
||
|
// TRACE1("Inserting drive %s\n", fullpath.m_szDrive);
|
||
|
m_drive = fullpath.m_drive;
|
||
|
}
|
||
|
if (m_dir.IsEmpty())
|
||
|
{
|
||
|
// TRACE1("Inserting directory %s\n", fullpath.m_szDir);
|
||
|
m_dir = fullpath.m_dir;
|
||
|
}
|
||
|
if (m_file.IsEmpty())
|
||
|
{
|
||
|
// TRACE1("Inserting file %s\n", fullpath.m_szFile);
|
||
|
m_file = fullpath.m_file;
|
||
|
}
|
||
|
if (m_ext.IsEmpty())
|
||
|
{
|
||
|
// TRACE1("Inserting extension %s\n", fullpath.m_szExt);
|
||
|
m_ext = fullpath.m_ext;
|
||
|
}
|
||
|
return *this;
|
||
|
}
|
||
|
|
||
|
CDosPath CDosPath::operator|(CDosPath &fullpath)
|
||
|
{
|
||
|
CDosPath temp(GetPath());
|
||
|
temp |= fullpath;
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
CString CDosPath::GetPath() const
|
||
|
{
|
||
|
CString temp;
|
||
|
#if USE_SECURE
|
||
|
_tmakepath_s(temp.GetBufferSetLength(_MAX_PATH), _MAX_PATH, m_drive, m_dir, m_file, m_ext);
|
||
|
#else
|
||
|
_tmakepath(temp.GetBufferSetLength(_MAX_PATH), m_drive, m_dir, m_file, m_ext);
|
||
|
#endif
|
||
|
temp.ReleaseBuffer();
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
CString CDosPath::GetPathOnly() const
|
||
|
{
|
||
|
CString temp;
|
||
|
#if USE_SECURE
|
||
|
_tmakepath_s(temp.GetBufferSetLength(_MAX_PATH), _MAX_PATH, m_drive, m_dir, NULL, NULL);
|
||
|
#else
|
||
|
_tmakepath(temp.GetBufferSetLength(_MAX_PATH), m_drive, m_dir, NULL, NULL);
|
||
|
#endif
|
||
|
temp.ReleaseBuffer();
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
CDosPath CDosPath::CurrentPath()
|
||
|
{
|
||
|
TCHAR szBuffer[_MAX_PATH];
|
||
|
_tgetcwd(szBuffer, _MAX_PATH);
|
||
|
return CDosPath(szBuffer, PATH_ONLY);
|
||
|
}
|
||
|
|
||
|
CDosPath CDosPath::AppPath()
|
||
|
{
|
||
|
TCHAR szBuffer[_MAX_PATH];
|
||
|
#ifdef _MFC
|
||
|
GetModuleFileName(AfxGetApp()->m_hInstance, szBuffer, _MAX_PATH);
|
||
|
#else
|
||
|
GetModuleFileName(GetModuleHandle(NULL), szBuffer, _MAX_PATH);
|
||
|
#endif
|
||
|
return CDosPath(szBuffer);
|
||
|
}
|
||
|
|
||
|
CDosPath CDosPath::WindowsPath()
|
||
|
{
|
||
|
TCHAR szBuffer[_MAX_PATH];
|
||
|
GetWindowsDirectory(szBuffer, _MAX_PATH);
|
||
|
return CDosPath(szBuffer, PATH_ONLY);
|
||
|
}
|
||
|
|
||
|
#ifdef MAKE_EXE
|
||
|
#include <stdio.h>
|
||
|
|
||
|
void main(int ac, char *av[])
|
||
|
{
|
||
|
if (ac != 3)
|
||
|
{
|
||
|
printf("Usage: dospath incomplete complete\n");
|
||
|
return;
|
||
|
}
|
||
|
CDosPath a = av[1];
|
||
|
CDosPath b = av[2];
|
||
|
a |= b;
|
||
|
printf("%s |= %s = %s\n", av[1], av[2], (const char *) a.GetPath());
|
||
|
printf("\n\n\n\n");
|
||
|
a = CDosPath::CurrentPath();
|
||
|
printf("Current = %s\n", (const char *)a.GetPath());
|
||
|
a = CDosPath::AppPath();
|
||
|
printf("App = %s\n", (const char *)a.GetPath());
|
||
|
a = CDosPath::TempPath();
|
||
|
printf("Temp = %s\n", (const char *)a.GetPath());
|
||
|
}
|
||
|
#endif
|