File Annotation

Not logged in
dcdd144598 2011-02-23        kinaba: #include "stdafx.h"
dcdd144598 2011-02-23        kinaba: #include "path.h"
dcdd144598 2011-02-23        kinaba: using namespace ki;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: //=========================================================================
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path& Path::BeSpecialPath( int nPATH, bool bs )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	TCHAR* buf = AllocMem( MAX_PATH+1 );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	switch( nPATH )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 	case Win:     ::GetWindowsDirectory( buf, MAX_PATH );     break;
dcdd144598 2011-02-23        kinaba: 	case Sys:     ::GetSystemDirectory( buf, MAX_PATH );      break;
dcdd144598 2011-02-23        kinaba: 	case Tmp:     ::GetTempPath( MAX_PATH, buf );             break;
dcdd144598 2011-02-23        kinaba: 	case Cur:     ::GetCurrentDirectory( MAX_PATH, buf );     break;
dcdd144598 2011-02-23        kinaba: 	case Exe:
dcdd144598 2011-02-23        kinaba: 	case ExeName: ::GetModuleFileName( NULL, buf, MAX_PATH ); break;
dcdd144598 2011-02-23        kinaba: 	default:
dcdd144598 2011-02-23        kinaba: 		*buf = TEXT('\0');
dcdd144598 2011-02-23        kinaba: 		{
dcdd144598 2011-02-23        kinaba: 			LPITEMIDLIST il;
dcdd144598 2011-02-23        kinaba: 			if( NOERROR==::SHGetSpecialFolderLocation( NULL, nPATH, &il ) )
dcdd144598 2011-02-23        kinaba: 			{
dcdd144598 2011-02-23        kinaba: 				::SHGetPathFromIDList( il, buf );
dcdd144598 2011-02-23        kinaba: 				::CoTaskMemFree( il );
dcdd144598 2011-02-23        kinaba: 			}
dcdd144598 2011-02-23        kinaba: 		}
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	UnlockMem();
dcdd144598 2011-02-23        kinaba: 	if( nPATH != ExeName )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		if( nPATH == Exe )
dcdd144598 2011-02-23        kinaba: 			BeDirOnly();
dcdd144598 2011-02-23        kinaba: 		BeBackSlash( bs );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	return *this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path& Path::BeBackSlash( bool add )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	// 最後の一文字を得る
dcdd144598 2011-02-23        kinaba: 	const TCHAR* last=c_str();
dcdd144598 2011-02-23        kinaba: 	for( const TCHAR *p=last; *p!=TEXT('\0'); p=next(p) )
dcdd144598 2011-02-23        kinaba: 		last = p;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( *last==TEXT('\\') || *last==TEXT('/') )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		if( !add )
dcdd144598 2011-02-23        kinaba: 			TrimRight( 1 );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	else if( add && *last!=TEXT('\0') )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		*this += TEXT('\\');
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	return *this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path& Path::BeDirOnly()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	const TCHAR* lastslash = c_str()-1;
dcdd144598 2011-02-23        kinaba: 	for( const TCHAR* p=lastslash+1; *p!=TEXT('\0'); p=next(p) )
dcdd144598 2011-02-23        kinaba: 		if( *p==TEXT('\\') || *p==TEXT('/') )
dcdd144598 2011-02-23        kinaba: 			lastslash = p;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	TrimRight( len() - ulong((lastslash+1)-c_str()) );
dcdd144598 2011-02-23        kinaba: 	return *this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path& Path::BeDriveOnly()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	if( len() > 2 )
dcdd144598 2011-02-23        kinaba: 	{
dcdd144598 2011-02-23        kinaba: 		const TCHAR* p = c_str()+2;
dcdd144598 2011-02-23        kinaba: 		for( ; *p!=TEXT('\0'); p=next(p) )
dcdd144598 2011-02-23        kinaba: 			if( *p==TEXT('\\') || *p==TEXT('/') )
dcdd144598 2011-02-23        kinaba: 				break;
dcdd144598 2011-02-23        kinaba: 		if( *p!=TEXT('\0') )
dcdd144598 2011-02-23        kinaba: 			TrimRight( len() - ulong((p+1)-c_str()) );
dcdd144598 2011-02-23        kinaba: 	}
dcdd144598 2011-02-23        kinaba: 	return *this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path& Path::BeShortStyle()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	TCHAR* buf = ReallocMem( len()+1 );
dcdd144598 2011-02-23        kinaba: 	::GetShortPathName( buf, buf, len()+1 );
dcdd144598 2011-02-23        kinaba: 	UnlockMem();
dcdd144598 2011-02-23        kinaba: 	return *this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path& Path::BeShortLongStyle()
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	WIN32_FIND_DATA fd;
dcdd144598 2011-02-23        kinaba: 	HANDLE h = ::FindFirstFile( c_str(), &fd );
dcdd144598 2011-02-23        kinaba: 	if( h == INVALID_HANDLE_VALUE )
dcdd144598 2011-02-23        kinaba: 		return *this;
dcdd144598 2011-02-23        kinaba: 	::FindClose( h );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	TCHAR  t;
dcdd144598 2011-02-23        kinaba: 	TCHAR* buf = ReallocMem( MAX_PATH*2 );
dcdd144598 2011-02-23        kinaba: 	TCHAR* nam = const_cast<TCHAR*>(name(buf));
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	if( nam != buf )
dcdd144598 2011-02-23        kinaba: 		t = *(nam-1), *(nam-1) = TEXT('\0');
dcdd144598 2011-02-23        kinaba: 	::lstrcpy( nam, fd.cFileName );
dcdd144598 2011-02-23        kinaba: 	if( nam != buf )
dcdd144598 2011-02-23        kinaba: 		*(nam-1) = t;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	UnlockMem();
dcdd144598 2011-02-23        kinaba: 	return *this;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: String Path::CompactIfPossible( int Mx )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	HMODULE hshl = ::LoadLibrary( TEXT("shlwapi.dll") );
dcdd144598 2011-02-23        kinaba: 	if( !hshl ) return *this;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	typedef BOOL (STDAPICALLTYPE *PCPE_t)( LPTSTR, LPCTSTR, UINT, DWORD );
dcdd144598 2011-02-23        kinaba: #ifdef _UNICODE
dcdd144598 2011-02-23        kinaba: 	PCPE_t MyPathCompactPathEx = (PCPE_t)::GetProcAddress( hshl, "PathCompactPathExW" );
dcdd144598 2011-02-23        kinaba: #else
dcdd144598 2011-02-23        kinaba: 	PCPE_t MyPathCompactPathEx = (PCPE_t)::GetProcAddress( hshl, "PathCompactPathExA" );
dcdd144598 2011-02-23        kinaba: #endif
dcdd144598 2011-02-23        kinaba: 	if( !MyPathCompactPathEx ) return *this;
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	TCHAR* buf = new TCHAR[Mx+2];
dcdd144598 2011-02-23        kinaba: 	MyPathCompactPathEx( buf, c_str(), Mx+1, 0 );
dcdd144598 2011-02-23        kinaba: 	::FreeLibrary( hshl );
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: 	String ans = buf;
dcdd144598 2011-02-23        kinaba: 	delete [] buf;
dcdd144598 2011-02-23        kinaba: 	return ans;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: const TCHAR* Path::name( const TCHAR* str )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	const TCHAR* ans = str - 1;
dcdd144598 2011-02-23        kinaba: 	for( const TCHAR* p=str; *p!=TEXT('\0'); p=next(p) )
dcdd144598 2011-02-23        kinaba: 		if( *p==TEXT('\\') || *p==TEXT('/') )
dcdd144598 2011-02-23        kinaba: 			ans = p;
dcdd144598 2011-02-23        kinaba: 	return (ans+1);
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: const TCHAR* Path::ext( const TCHAR* str )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	const TCHAR *ans = NULL, *p;
dcdd144598 2011-02-23        kinaba: 	for( p=name(str); *p!=TEXT('\0'); p=next(p) )
dcdd144598 2011-02-23        kinaba: 		if( *p==TEXT('.') )
dcdd144598 2011-02-23        kinaba: 			ans = p;
dcdd144598 2011-02-23        kinaba: 	return ans ? (ans+1) : p;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: const TCHAR* Path::ext_all( const TCHAR* str )
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	const TCHAR* p;
dcdd144598 2011-02-23        kinaba: 	for( p=name(str); *p!=TEXT('\0'); p=next(p) )
dcdd144598 2011-02-23        kinaba: 		if( *p==TEXT('.') )
dcdd144598 2011-02-23        kinaba: 			return (p+1);
dcdd144598 2011-02-23        kinaba: 	return p;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path Path::body() const
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	const TCHAR* nm = name();
dcdd144598 2011-02-23        kinaba: 	const TCHAR* ex = ext() - 1;
dcdd144598 2011-02-23        kinaba: 	TCHAR t = *ex;
dcdd144598 2011-02-23        kinaba: 	*const_cast<TCHAR*>(ex) = TEXT('\0');
dcdd144598 2011-02-23        kinaba: 	Path ans = nm;
dcdd144598 2011-02-23        kinaba: 	*const_cast<TCHAR*>(ex) = t;
dcdd144598 2011-02-23        kinaba: 	return ans;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: 
dcdd144598 2011-02-23        kinaba: Path Path::body_all() const
dcdd144598 2011-02-23        kinaba: {
dcdd144598 2011-02-23        kinaba: 	const TCHAR* nm = name();
dcdd144598 2011-02-23        kinaba: 	const TCHAR* ex = ext_all() - 1;
dcdd144598 2011-02-23        kinaba: 	TCHAR t = *ex;
dcdd144598 2011-02-23        kinaba: 	*const_cast<TCHAR*>(ex) = TEXT('\0');
dcdd144598 2011-02-23        kinaba: 	Path ans = nm;
dcdd144598 2011-02-23        kinaba: 	*const_cast<TCHAR*>(ex) = t;
dcdd144598 2011-02-23        kinaba: 	return ans;
dcdd144598 2011-02-23        kinaba: }
dcdd144598 2011-02-23        kinaba: