#pragma once
/*
	PathTools.h

	Version		: 0.0 (Release1)
	Version		: 0.0 (Release1)
	説明		: ファイルの検索やパスの処理など


	作成日		: 2000/12/07
	修正日		: 2009/08/29
	改定履歴	: 
*/

#include <shlobj.h>

/*!
	パス関係の処理を行うクラス
*/
class CPathTools
{
public:
public:
	///////////////////////////////////////////////////////////////////////
	//	パス変換
	///////////////////////////////////////////////////////////////////////
	//!	ドライブ名の取得
	static CString PathToDrive(CString path);

	//!	ディレクトリパスの取得
	static CString PathToDir(CString path);

	//!	ファイル名の取得
	static CString PathToName(CString path);

	//!	ファイル名の取得(拡張子なし)
	static CString PathToNameNoExt(CString path);

	//!	ファイル拡張子の取得
	static CString PathToExt(CString path);

	//!	ひとつ上のディレクトリパスを取得
	static CString GetUpDir(CString path);

	//!	使えない文字を置き換え
	static CString SafeName(CString name, CString replace = _T("_"));

	//!	表示名（ファイル名 or フォルダ名 or ドライブ名）取得
	static CString PathToViewName(CString name);

	///////////////////////////////////////////////////////////////////////
	//	パスの比較
	///////////////////////////////////////////////////////////////////////
	//!	パスに含まれているか調べる
	static int IsInPath(CString parentPath, CString childPath);

	///////////////////////////////////////////////////////////////////////
	//	/\の加工
	///////////////////////////////////////////////////////////////////////
	//!	スラッシュを後ろに追加
	static CString AddSlash(CString path);

	//!	バックスラッシュを後ろに追加
	static CString AddBackSlash(CString path);

	//!	スラッシュを後ろから削除
	static CString RemoveSlash(CString path);

	//!	バックスラッシュを後ろから削除
	static CString RemoveBackSlash(CString path);

	//!	最後にスラッシュがあるか
	static int CheckSlash(CString path);
	
	//!	最後にバックスラッシュがあるか
	static int CheckBackSlash(CString path);
	
	//!	最後の文字をチェック
	static int CheckLastChar(CString path, TCHAR c);

	///////////////////////////////////////////////////////////////////////
	//	モジュールパス
	///////////////////////////////////////////////////////////////////////
	//!	モジュールパス取得
	static CString GetAppPath();

	//!	モジュールパス取得
	static CString GetAppPathName();

	/////////////////////////////////////////////////////////////////////////
	//	各種パスを取得
	/////////////////////////////////////////////////////////////////////////
	//!	パス変数を置き換え後のパスを取得
	static CString GetPathSwapString(CString path);

	//!	Windows パス取得
	static CString GetWindowsPath();

	//!	System32 パス取得
	static CString GetSystem32Path();

	//!	Program Files パス取得
	static CString GetProgramFilesPath();

	//!	All Users/Application Data パス取得
	static CString GetCommonAppDataPath();
};


/*!
	実装
*/
///////////////////////////////////////////////////////////////////////
//	パス変換
///////////////////////////////////////////////////////////////////////
/*!
	関数名		: CPathTools::PathToName(CString path)
	処理内容	: パスからファイル名を取得
	引数		: パス
	帰り値		: ファイル名
*/
_inline CString CPathTools::PathToDrive(CString path)
{
	if(path.Mid(1,1) != _T(":"))
		return(_T(""));

	return(path.Left(1) + _T(":")); //	(X:)
}

/*!
	関数名		: CPathTools::PathToName(CString path)
	処理内容	: パスからファイル名を取得
	引数		: パス
	帰り値		: ファイル名
*/
_inline CString CPathTools::PathToName(CString path)
{
	int	index;

	index = path.ReverseFind(_T('\\'));
	if(index==-1)
		return(path);

	return(path.Right(path.GetLength() - index - 1));
}

/*!
	関数名		: CPathTools::PathToNameNoExt(CString path)
	処理内容	: パスからファイル名(拡張子なし)を取得
	引数		: パス
	帰り値		: ファイル名(拡張子なし)
*/
_inline CString CPathTools::PathToNameNoExt(CString path)
{
	CString	name = PathToName(path);
	int index = name.ReverseFind(_T('.'));
	if(index == -1)
		return(name);
	else
		return(name.Left(index));
}

/*!
	関数名		: CPathTools::PathToDir(CString path)
	処理内容	: パスからファイル名を削除
	引数		: パス
	帰り値		: パス
*/
_inline CString CPathTools::PathToDir(CString path)
{
	int	index;

	index = path.ReverseFind(_T('\\'));
	if(index==-1)
		return(_T(""));

	path = path.Left(index);
	path = AddBackSlash(path);

	return(path);
}

/*!
	関数名		: CPathTools::PathToDir(CString path)
	処理内容		: パスから拡張子を取得
	引数			: パス
	帰り値		: パス
*/
_inline CString CPathTools::PathToExt(CString path)
{
	int	index;

	index = path.ReverseFind(_T('.'));
	if(index==-1)
		return(path);

	return(path.Right(path.GetLength() - index - 1));
}


/*!
	表示名（ファイル名 or フォルダ名 or ドライブ名）取得
*/
_inline CString CPathTools::PathToViewName(CString path)
{
	//	ファイル名を取得
	CString name = PathToName(path);
	if(!name.IsEmpty())
		return(name);
	
	//	バックスラッシュを削除
	path = RemoveBackSlash(path);

	//	ドライブ？
	if(CheckLastChar(path, _T(':')))
		return(path + _T("\\"));

	//	ディレクトリ
	return(PathToName(path));
}

/*!
	ひとつ上のディレクトリパスを取得
*/
_inline CString CPathTools::GetUpDir(CString path)
{
	path = RemoveBackSlash(path);
	int index = path.ReverseFind(_T('\\'));
	if(index == -1)
		return(path);

	return(AddBackSlash(path.Mid(0,index)));
}


/*!
	使えない文字を置き換え
*/
_inline CString CPathTools::SafeName(CString name, CString replace)
{
	name.Replace(_T("/"),replace);
	name.Replace(_T("\\"),replace);
	name.Replace(_T(":"),replace);
	name.Replace(_T("?"),replace);
	name.Replace(_T("*"),replace);
	name.Replace(_T("\""),replace);
	name.Replace(_T(">"),replace);
	name.Replace(_T("<"),replace);

	return(name);
}

///////////////////////////////////////////////////////////////////////
//	パスの比較
///////////////////////////////////////////////////////////////////////
/*!
	パスに含まれているか調べる

	\param parentPath	このパスのサブディレクトリか調べる
	\param childPath	調べるパス
	\return				TRUE:サブディレクトリ
*/
_inline int CPathTools::IsInPath(CString parentPath, CString childPath)
{
	if(parentPath.CompareNoCase(childPath.Left(parentPath.GetLength())) == 0)
		return(TRUE);

	return(FALSE);
}

///////////////////////////////////////////////////////////////////////
//	/\の加工
///////////////////////////////////////////////////////////////////////
/*!
	スラッシュを後ろに追加
*/
_inline CString CPathTools::AddSlash(CString path)
{
	if(CheckSlash(path))
		return(path);

	return(path + _T("/"));
}

/*!
	バックスラッシュを後ろに追加
*/
_inline CString CPathTools::AddBackSlash(CString path)
{
	if(CheckSlash(path) || CheckBackSlash(path))
		return(path);

	return(path + _T("\\"));
}

/*!
	スラッシュを後ろから削除
*/
_inline CString CPathTools::RemoveSlash(CString path)
{
	if(CheckSlash(path))
		path = path.Left(path.GetLength()-1);

	return(path);
}

/*!
	バックスラッシュを後ろから削除
*/
_inline CString CPathTools::RemoveBackSlash(CString path)
{
	if(CheckBackSlash(path))
		path = path.Left(path.GetLength()-1);

	return(path);
}

/*!
	最後の文字をチェック
*/
_inline int CPathTools::CheckLastChar(CString path, TCHAR c)
{
	LPCTSTR	ptr = path;

	//	空文字列
	if(*ptr == 0)
		return(0);

#ifdef _UNICODE
	while(1)
	{
		//	終了?
		if(*(ptr+1) == 0)
		{
			if(*ptr == c)
				return(1);
			else
				return(0);
		}

		ptr++;
	}
#else
	while(1)
	{
		//	シングルバイト
		if(*ptr <= 0x80 || (*ptr >= 0xA0 && *ptr <= 0xDF))
		{
			//	終了?
			if(*(ptr+1) == 0)
			{
				if(*ptr == c)
					return(1);
				else
					return(0);
			}
			ptr++;
		}
		else
		{
			//	終了?
			if(*(ptr+1) == 0 || *(ptr+2) == 0)
				return(0);
			ptr+=2;
		}
	}
#endif
}

/*!
	最後にスラッシュがあるか
*/
_inline int CPathTools::CheckSlash(CString path)
{
	return(CheckLastChar(path,_T('/')));
}

/*!
	最後にバックスラッシュがあるか
*/
_inline int CPathTools::CheckBackSlash(CString path)
{
	return(CheckLastChar(path,_T('\\')));
}

///////////////////////////////////////////////////////////////////////
//	モジュールパス
///////////////////////////////////////////////////////////////////////
/*!
	モジュールパス取得
*/
_inline CString CPathTools::GetAppPath()
{
	TCHAR	s[MAX_PATH+1];
	DWORD len = GetModuleFileName(NULL, s, MAX_PATH);

	while (s[len--]!=_T('\\') && len!=0 )
		;
	s[len+2] = _T('\0');        // ￥マークで終わらせる

	return(s);
}

/*!
	モジュールパス名取得
*/
_inline CString CPathTools::GetAppPathName()
{
	TCHAR	s[MAX_PATH+1];
	GetModuleFileName(NULL, s, MAX_PATH);

	return(s);
}



/////////////////////////////////////////////////////////////////////////
//	各種パスを取得
/////////////////////////////////////////////////////////////////////////
/*!
	パス変数を置き換え後のパスを取得

	%WINDOWS%		c:\Windows
	%SYSTEM32%		c:\Windows\System32
	%PROGRAMFILES%	c:\Program Files
*/
_inline CString CPathTools::GetPathSwapString(CString path)
{
	//	サイズ取得
	int len = ExpandEnvironmentStrings(path, NULL, 0) + 1;

	//	変換
	CString	ret;
	ExpandEnvironmentStrings(path, ret.GetBuffer(len + 1), len);
	ret.ReleaseBuffer();

	return(ret);
}

/*!
	Windows パス取得
*/
_inline CString CPathTools::GetWindowsPath()
{
	TCHAR szPath[_MAX_PATH];

	SHGetSpecialFolderPath(NULL, szPath, CSIDL_WINDOWS, FALSE);

	return(CPathTools::AddBackSlash(szPath));
}

/*!
	System32 パス取得
*/
_inline CString CPathTools::GetSystem32Path()
{
	TCHAR szPath[_MAX_PATH];

	SHGetSpecialFolderPath(NULL, szPath, CSIDL_SYSTEM, FALSE);

	return(CPathTools::AddBackSlash(szPath));
}

/*!
	Program Files パス取得
*/
_inline CString CPathTools::GetProgramFilesPath()
{
	TCHAR szPath[_MAX_PATH];

	SHGetSpecialFolderPath(NULL, szPath, CSIDL_PROGRAM_FILES, FALSE);

	return(CPathTools::AddBackSlash(szPath));
}


/*!
	All Users/Application Data パス取得
*/
_inline CString CPathTools::GetCommonAppDataPath()
{
	TCHAR szPath[_MAX_PATH];

	SHGetSpecialFolderPath(NULL, szPath, CSIDL_COMMON_APPDATA, FALSE);

	return(CPathTools::AddBackSlash(szPath));
}

