#include "StdAfx.h" #include "CFilePathManager.h" // °æ°í ¸·±â. #pragma warning ( disable : 4996 ) //----------------------------------------------------------------------------- // Àü¿ª ¹ø¼ö Á¤ÀÇ CFilePathManager g_FilePathMng( "Resources" ); //----------------------------------------------------------------------------- // ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â CÇÔ¼ö Àü¹æ ¼±¾ð //----------------------------------------------------------------------------- int FindFolderUpTokenCount( LPCSTR str ); void FilePathUp( LPSTR pPathBuffer, int count ); void CharacterChange( LPSTR pPathBuffer, CHAR DestCh, CHAR SrcCh ); //----------------------------------------------------------------------------- // // CFilePathManager // //----------------------------------------------------------------------------- CFilePathManager::CFilePathManager(void) : m_WorkingPath () , m_FileNames () , m_OverlapCount ( 0 ) { } CFilePathManager::CFilePathManager( LPCSTR p_WorkingFolder ) { Initialize( p_WorkingFolder ); } CFilePathManager::~CFilePathManager(void) { m_FileNames.clear(); } // ---------------------- Funtion Info ------------------------- // ¸ñÀû : ÀÛ¾÷Æú´õÀÇ ¸ðµç ÆÄÀÏÀ̸§À» ¾ò¾î³½´Ù. // ¸Å°³º¯¼ö: p_WorkingFolder°¡ NULL À̸é ÀÀ¿ëÇÁ·Î±×·¥ ±âº» °æ·Î·Î ÁöÁ¤µÈ´Ù. // ¹Ýȯ°ª: ¼º°ø¿©ºÎ // ¼³¸í: // ---------------------------------------------------------- BOOL CFilePathManager::Initialize( LPCSTR p_WorkingFolder ) { string FullWorkingFolder; CHAR CurrentDir[MAX_PATH]; CHAR WorkingFolderPath[MAX_PATH]; GetCurrentDirectory( MAX_PATH, CurrentDir ); strcpy( WorkingFolderPath, p_WorkingFolder ); CharacterChange( WorkingFolderPath, '/', '\\' ); // p_WorkingFolder°¡ NULLÀÌ ¾Æ´Ï¸é // °æ·Î¸¦ °Ë»çÇÑ´Ù. if ( p_WorkingFolder ) { // "../"°¡ ¸î°³ µé¾îÀÖ´ÂÁö °Ë»ç¸¦ ÇÑ´Ù. int UpTokenCount = FindFolderUpTokenCount( WorkingFolderPath ); // "../"ÀÇ °³¼ö ¸¸Å­ °æ·Î¸¦ Ãà¼Ò½ÃŲ´Ù. FilePathUp( CurrentDir, UpTokenCount ); CHAR WorkingDirName[MAX_PATH]; strcpy( WorkingDirName, WorkingFolderPath+UpTokenCount*3 ); strcat( CurrentDir, "\\" ); strcat( CurrentDir, WorkingDirName ); } FullWorkingFolder = CurrentDir; if ( !FindAllFileNames( FullWorkingFolder.c_str() ) ) { return FALSE; } // ÀÛ¾÷°æ·Î¸¦ ÁöÁ¤ÇÑ´Ù. m_WorkingPath = FullWorkingFolder; return TRUE; } // ---------------------- Funtion Info ------------------------- // ¸ñÀû : ÆÄÀÏÀ̸§ÀÇ Àüü °æ·Î¸¦ ¾ò¾î³½´Ù. // ¸Å°³º¯¼ö: // ¹Ýȯ°ª: // ¼³¸í: // ---------------------------------------------------------- BOOL CFilePathManager::GetFullPath( LPSTR p_FileName, LPSTR p_RetFullFileName ) { MapFileName::iterator retIter; retIter = m_FileNames.find( p_FileName ); if ( retIter == m_FileNames.end() ) { return FALSE; } strcpy( p_RetFullFileName, retIter->second.c_str() ); strcat( p_RetFullFileName, "\\" ); strcat( p_RetFullFileName, retIter->first.c_str() ); return TRUE; } // ---------------------- Funtion Info ------------------------- // ¸ñÀû : ¸Å°³º¯¼ö·Î ³Ñ¾î¿Â Æú´õ°¡ Æ÷ÇÔÇÏ´Â ¸ðµç ÆÄÀÏÀÇ À̸§À» ã¾Æ¼­ ÀúÀåÇÑ´Ù. // ¸Å°³º¯¼ö: °Ë»çÇÒ Æú´õ. // ¹Ýȯ°ª: ¼º°ø ¿©ºÎ // ¼³¸í: Àç±ÍÇÔ¼öÀÌ´Ù. // ---------------------------------------------------------- BOOL CFilePathManager::FindAllFileNames( LPCSTR p_FolderName ) { if ( NULL == p_FolderName ) return FALSE; string FolderName; HANDLE hFind = INVALID_HANDLE_VALUE; WIN32_FIND_DATA FindFileData; FolderName = p_FolderName; FolderName += "\\*"; hFind = FindFirstFile( FolderName.c_str(), &FindFileData ); if ( hFind == INVALID_HANDLE_VALUE ) { return FALSE; } list FolderList; // ÇÏÀ§ Æú´õÀÇ À̸§µé. // ¿¹¿Ü À̸§ÀÌ ¾Æ´Ï°í Æú´õ°¡ ¾Æ´Ò¶§ ÆÄÀÏÀ̸§¸ñ·Ï¿¡ Ãß°¡ÇÑ´Ù. if ( !IsExceptionName(FindFileData.cFileName) && ( FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY ) ) { if ( !InsertFileName( FindFileData.cFileName, p_FolderName ) ) { OutputDebugString("ÆÄÀÏÀ̸§ÀÌ Áߺ¹ÀÌ¶ó¼­ ½ÇÆÐÇÏ¿´½À´Ï´Ù."); } } // ¿¹¿Ü À̸§ÀÌ ¾Æ´Ï°í Æú´õÀ϶§ Æú´õ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. if ( !IsExceptionName(FindFileData.cFileName) && ( FindFileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY ) ) { FolderList.push_back( FindFileData.cFileName ); } // ·çÇÁ¸¦ µ¹¸é¼­ ´ÙÀ½ ÆÄÀÏÀ̸§À» ã´Â´Ù. while ( FindNextFile( hFind, &FindFileData ) != 0 ) { // ó¸®ÇÏ¸é ¾ÈµÇ´Â ÆÄÀÏÀ̸§ÀÏ °æ¿ì Ãß°¡ÇÏÁö ¾Ê´Â´Ù. if ( IsExceptionName(FindFileData.cFileName) ) { continue; } // ¼Ó¼ºÀÌ Æú´õÀÏ °æ¿ì¿¡ ÇÏÀ§ Æú´õ ¸®½ºÆ®¿¡ Ãß°¡ÇÑ´Ù. if ( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY ) { FolderList.push_back( FindFileData.cFileName ); continue; } // ÆÄÀÏÀ̸§À» Ãß°¡ÇÑ´Ù. if ( !InsertFileName( FindFileData.cFileName, p_FolderName ) ) { OutputDebugString("ÆÄÀÏÀ̸§ÀÌ Áߺ¹ÀÌ¶ó¼­ ½ÇÆÐÇÏ¿´½À´Ï´Ù."); } } FindClose( hFind ); // ÇÏÀ§ Æú´õ¸¦ °Ë»öÇÑ´Ù. list::iterator iter; string ChildFolder; for ( iter = FolderList.begin() ; iter != FolderList.end() ; ++iter ) { ChildFolder = p_FolderName; ChildFolder += "\\"; ChildFolder += (*iter); if ( !FindAllFileNames( ChildFolder.c_str() ) ) { return FALSE; } } return TRUE; } // ---------------------- Funtion Info ------------------------- // ¸ñÀû : ¿¹¿Ü·Î Ãë±ÞÇÒ ÆÄÀÏ À̸§À» °Ë»çÇÑ´Ù. // ¸Å°³º¯¼ö: °Ë»çÇÒ ÆÄÀÏÀ̸§. // ¹Ýȯ°ª: ¿¹¿ÜÆÄÀÏÀ̸§Àϰæ¿ì TRUE // ¼³¸í: // Æú´õ°¡ Æ÷ÇÔÇÏ´Â ÆÄÀÏÀ̸§À» °Ë»çÇÒ °æ¿ì // "..", "."°¡ ³ª¿À±â ¶§¹®¿¡ ÀÌ À̸§ÀÎÁö¸¦ °Ë»çÇØ¾ßÇÑ´Ù. // ---------------------------------------------------------- BOOL CFilePathManager::IsExceptionName( LPCSTR p_Name ) { int ret = strcmp( p_Name, ".." ); if ( ret == 0 ) { return TRUE; } ret = strcmp( p_Name, "." ); if ( ret == 0 ) { return TRUE; } return FALSE; } // ---------------------- Funtion Info ------------------------- // ¸ñÀû : ÆÄÀÏ À̸§À» Ãß°¡ÇÑ´Ù. // ¸Å°³º¯¼ö: ÆÄÀÏÀ̸§°ú ÀÌ ÆÄÀÏÀÇ °æ·Î // ¹Ýȯ°ª: ¼º°ø¿©ºÎ // ¼³¸í: ÆÄÀÏÀ̸§ÀÌ Áߺ¹ÀÏ °æ¿ì¿¡ ½ÇÆÐÇÑ´Ù. // ---------------------------------------------------------- BOOL CFilePathManager::InsertFileName( LPCSTR p_FileName, LPCSTR p_FilePath ) { pair retVal; retVal = m_FileNames.insert( MapFileName::value_type( string(p_FileName), string(p_FilePath) ) ); if ( retVal.second == false ) { m_OverlapCount++; // Áߺ¹È½¼ö¸¦ ÀúÀåÇÑ´Ù. µð¹ö±ë½Ã¿¡ ÆíÇ϶ó°í. return FALSE; } return TRUE; } //----------------------------------------------------------------------------- // ³»ºÎ¿¡¼­ »ç¿ëÇÏ´Â CÇÔ¼ö ±¸Çö //----------------------------------------------------------------------------- // ---------------------- Funtion Info ------------------------- // ¸ñÀû : "../"°¡ ¸î°³ µé¾îÀÖ´ÂÁö °Ë»çÇÏ´Â ÇÔ¼ö. // ¸Å°³º¯¼ö: // ¹Ýȯ°ª: // ¼³¸í: // ---------------------------------------------------------- int FindFolderUpTokenCount( LPCSTR str ) { int i = 0; int count = 0; while ( str[i] != 0 ) { if ( str[i] != '.' ) break; i++; if ( str[i] != '.' ) break; i++; if ( str[i] != '\\' ) break; i++; count ++; } return count; } void FilePathUp( LPSTR pPathBuffer, int count ) { int Length = lstrlen( pPathBuffer ); while ( count > 0 ) { if ( pPathBuffer[--Length] == '\\' ) { --count; } pPathBuffer[Length] = NULL; } } void CharacterChange( LPSTR pPathBuffer, CHAR DestCh, CHAR SrcCh ) { int Length = lstrlen( pPathBuffer ); for ( int i = 0 ; i < Length ; ++i ) { if ( pPathBuffer[i] == DestCh ) { pPathBuffer[i] = SrcCh; } } }