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: