/////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// #include "STDAFX.H" #include "DIRECTORY.H" #include "COMMONMACROS.H" #include "BASESET.H" #include "DEBUGUTIL.H" #include "SAFESTRINGMACROS.H" #include "STRINGSET.H" #include // _access #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif const TCHAR CDirectory::m_szSourceDirectorySeperator[3] = { _T('\\'), _T(':'), _T('\0'), // Á¾·á ¹®ÀÚ¿­ }; /////////////////////////////////////////////////////////////////// // IMPLEMENTATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::CDirectory //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- CDirectory::CDirectory() { Reset(); }; //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::~CDirectory //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- CDirectory::~CDirectory() { // °´Ã¼ ¼Ò¸ê ½Ã ±îÁö ÀÚ¿øÇØÁ¦°¡ ¾ÊµÉ °æ¿ì¸¦ ´ëºñ End(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Reset //*--------------------------------------------------------------- // DESC : °´Ã¼ ÀÚ¿ø ¸®¼Â // PARM : N/A // RETV : N/A // PRGM : B4nFter // P.S.> // - ÇÚµéÀ» ´Ý´Â°ÍÀÌ ¾Æ´Ï¹Ç·Î ÁÖÀÇ //*--------------------------------------------------------------- VOID CDirectory::Reset() { m_hFind = INVALID_HANDLE_VALUE; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Begin //*--------------------------------------------------------------- // DESC : ƯÁ¤ °æ·ÎÀÇ Æ¯Á¤ ÆÄÀÏµé °Ë»ö °³½Ã // PARM : 1 . lpszDirectoryFileName - °Ë»öÇÒ ÆÄÀϰæ·Î // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::Begin(LPCTSTR lpszDirectoryFileName) { DN_ASSERT(!IsOpen(), "Already Called!"); // CHECK_STRING(lpszDirectoryFileName, DF_DIR_MAX_PATH); if (INVALID_HANDLE_VALUE != m_hFind) { return(1); } m_hFind = ::FindFirstFile(lpszDirectoryFileName, &m_stFindData); if (INVALID_HANDLE_VALUE != m_hFind) { return(NOERROR); } else { return(::GetLastError()); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Next //*--------------------------------------------------------------- // DESC : CDirectory::Begin È£Ãâ ÀÌÈÄ °è¼Ó °Ë»ö ¼öÇà // PARM : N/A // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter // P.S.> // - CDirectory::Begin ÀÌ ¿ì¼± È£ÃâµÇ¾î¾ß ÇÔ //*--------------------------------------------------------------- DWORD CDirectory::Next() { DN_ASSERT(IsOpen(), "Must Call CDirectory::Begin() First!"); if (::FindNextFile(m_hFind, &m_stFindData)) { return(NOERROR); } else { return(::GetLastError()); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::End //*--------------------------------------------------------------- // DESC : ÆÄÀÏ °Ë»öÀ» Á¾·á // PARM : N/A // RETV : N/A // PRGM : B4nFter // P.S.> // - CDirectory::Begin / CDirectory::Next °¡ ½ÇÆÐÇÏ´õ¶óµµ È£Ã⠵Ǿî¾ß ÇÔ //*--------------------------------------------------------------- VOID CDirectory::End() { if (INVALID_HANDLE_VALUE != m_hFind) { ::FindClose(m_hFind); m_hFind = INVALID_HANDLE_VALUE; } Reset(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Copy //*--------------------------------------------------------------- // DESC : ¿øº» µð·ºÅ丮¸¦ ¸ñÀû µð·ºÅ丮·Î º¹»ç // PARM : 1 . lpszSourceDirectoryName - ¿øº» µð·ºÅ丮 // 2 . lpszTargetDirectoryName - ¸ñÀû µð·ºÅ丮 // 4 . bOverWrite - µ¤¾î¾²±â ¿©ºÎ (±âº»°ª FALSE) // 5 . bSubDirectory - ÇϺΠµð·ºÅ丮 Ž»ö¿©ºÎ (±âº»°ª FALSE) // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::Copy(LPCTSTR lpszSourceDirectoryName, LPCTSTR lpszTargetDirectoryName, BOOL bOverWrite, BOOL bSubDirectory) { DN_ASSERT(NULL != lpszSourceDirectoryName, "Invalid!"); DN_ASSERT(NULL != lpszTargetDirectoryName, "Invalid!"); // ¸Å°³º¯¼ö üũ if (!lpszSourceDirectoryName || !_tcscmp(lpszSourceDirectoryName, _T(""))) { DN_RETURN(1); } if (!lpszTargetDirectoryName || !_tcscmp(lpszTargetDirectoryName, _T(""))) { DN_RETURN(1); } // µð·ºÅ丮 À¯È¿¼º üũ INT iRetVal; iRetVal = _taccess(lpszSourceDirectoryName, 0); if (iRetVal) { // ÇØ´ç ¿øº» µð·ºÅ丮´Â Á¸ÀçÇÏÁö ¾ÊÀ½ DN_RETURN(static_cast(iRetVal)); } iRetVal = _taccess(lpszTargetDirectoryName, 0); if (iRetVal) { // ÇØ´ç ¿øº» µð·ºÅ丮´Â Á¸ÀçÇÏÁö ¾ÊÀ½ DN_RETURN(static_cast(iRetVal)); } TCHAR szSourceDirectoryNameOut[DF_DIR_MAX_PATH] = { _T('\0'), }; TCHAR szTargetDirectoryNameOut[DF_DIR_MAX_PATH] = { _T('\0'), }; DWORD dwRetVal = CheckFixDirectoryName(lpszSourceDirectoryName, lpszTargetDirectoryName, szSourceDirectoryNameOut, COUNT_OF(szSourceDirectoryNameOut), szTargetDirectoryNameOut, COUNT_OF(szTargetDirectoryNameOut)); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } // º¹»çÀÛ¾÷ ÁøÇà (ÀÛ¾÷ ÈÄ ¿øº» À¯Áö) dwRetVal = CopyWork( szSourceDirectoryNameOut, szTargetDirectoryNameOut, FALSE, bOverWrite, bSubDirectory ); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } return(NOERROR); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Move //*--------------------------------------------------------------- // DESC : ¿øº» µð·ºÅ丮¸¦ ¸ñÀû µð·ºÅ丮·Î À̵¿ // PARM : 1 . lpszSourceDirectoryName - ¿øº» µð·ºÅ丮 // 2 . lpszTargetDirectoryName - ¸ñÀû µð·ºÅ丮 // 4 . bOverWrite - µ¤¾î¾²±â ¿©ºÎ (±âº»°ª FALSE) // 5 . bSubDirectory - ÇϺΠµð·ºÅ丮 Ž»ö¿©ºÎ (±âº»°ª FALSE) // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::Move(LPCTSTR lpszSourceDirectoryName, LPCTSTR lpszTargetDirectoryName, BOOL bOverWrite, BOOL bSubDirectory) { DN_ASSERT(NULL != lpszSourceDirectoryName, "Invalid!"); DN_ASSERT(NULL != lpszTargetDirectoryName, "Invalid!"); // ¸Å°³º¯¼ö üũ if (!lpszSourceDirectoryName || !_tcscmp(lpszSourceDirectoryName, _T(""))) { DN_RETURN(1); } if (!lpszTargetDirectoryName || !_tcscmp(lpszTargetDirectoryName, _T(""))) { DN_RETURN(1); } // µð·ºÅ丮 À¯È¿¼º üũ INT iRetVal; iRetVal = ::_taccess(lpszSourceDirectoryName, 0); if (iRetVal) { // ÇØ´ç ¿øº» µð·ºÅ丮´Â Á¸ÀçÇÏÁö ¾ÊÀ½ DN_RETURN(static_cast(iRetVal)); } iRetVal = ::_taccess(lpszTargetDirectoryName, 0); if (iRetVal) { // ÇØ´ç ¿øº» µð·ºÅ丮´Â Á¸ÀçÇÏÁö ¾ÊÀ½ DN_RETURN(static_cast(iRetVal)); } TCHAR szSourceDirectoryNameOut[DF_DIR_MAX_PATH] = { _T('\0'), }; TCHAR szTargetDirectoryNameOut[DF_DIR_MAX_PATH] = { _T('\0'), }; DWORD dwRetVal = CheckFixDirectoryName(lpszSourceDirectoryName, lpszTargetDirectoryName, szSourceDirectoryNameOut, COUNT_OF(szSourceDirectoryNameOut), szTargetDirectoryNameOut, COUNT_OF(szTargetDirectoryNameOut)); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } // º¹»çÀÛ¾÷ ÁøÇà (ÀÛ¾÷ ÈÄ ¿øº» »èÁ¦) dwRetVal = CopyWork( szSourceDirectoryNameOut, szTargetDirectoryNameOut, TRUE, bOverWrite, bSubDirectory ); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } // »èÁ¦Ã³¸® ¡æ µð·ºÅ丮 ³»ÀÇ ÆÄÀÏÀº ÀÌ¹Ì CDirectory::CopyWork() ¾È¿¡¼­ »èÁ¦µÇ¾î ÀÖÀ» °ÍÀÓ if (FALSE == ::RemoveDirectory(lpszSourceDirectoryName) && bSubDirectory ) { DN_RETURN(::GetLastError()); } return(NOERROR); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Rename //*--------------------------------------------------------------- // DESC : ¿øº» µð·ºÅ丮¸¦ ¸ñÀû µð·ºÅ丮·Î À̸§ º¯°æ // PARM : 1 . lpszSourceDirectoryName - ¿øº» µð·ºÅ丮 // 2 . lpszTargetDirectoryName - ¸ñÀû µð·ºÅ丮 // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::Rename(LPCTSTR lpszSourceDirectoryName, LPCTSTR lpszTargetDirectoryName) { DN_ASSERT(NULL != lpszSourceDirectoryName, "Invalid!"); DN_ASSERT(NULL != lpszTargetDirectoryName, "Invalid!"); // CHECK_STRING(lpszSourceDirectoryName, DF_DIR_MAX_PATH); // CHECK_STRING(lpszTargetDirectoryName, DF_DIR_MAX_PATH); // ¸Å°³º¯¼ö üũ if (!lpszSourceDirectoryName || !_tcscmp(lpszSourceDirectoryName, _T(""))) { DN_RETURN(1); } // ¸Å°³º¯¼ö üũ if (!lpszTargetDirectoryName || !_tcscmp(lpszTargetDirectoryName, _T(""))) { DN_RETURN(1); } if (FALSE == ::MoveFile(lpszSourceDirectoryName, lpszTargetDirectoryName)) { return(::GetLastError()); } return(NOERROR); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::Remove //*--------------------------------------------------------------- // DESC : ¿øº» µð·ºÅ丮¸¦ Á¦°Å // PARM : 1 . lpszSourceDirectoryName - ¿øº» µð·ºÅ丮 // 2 . bCheckFileExist - ÆÄÀÏÀÌ Á¸ÀçÇÏ¸é µð·ºÅ丮¸¦ Á¦°ÅÇÏÁö ¾ÊÀ»Áö ¿©ºÎ (±âº»°ª TRUE) // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::Remove(LPCTSTR lpszSourceDirectoryName, BOOL bCheckFileExist) { DN_ASSERT(NULL != lpszSourceDirectoryName, "Invalid!"); // CHECK_STRING(lpszSourceDirectoryName, DF_DIR_MAX_PATH); // ¸Å°³º¯¼ö üũ if (!lpszSourceDirectoryName || !_tcscmp(lpszSourceDirectoryName, _T(""))) { DN_RETURN(1); } TCHAR szSourceDirectoryName[DF_DIR_MAX_PATH] = { _T('\0'), }; STRNCPY(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), lpszSourceDirectoryName); INT iSourceDirectoryNameLen = (INT)_tcslen(szSourceDirectoryName); DN_ASSERT(0 < iSourceDirectoryNameLen, "Invalid!"); DN_ASSERT(COUNT_OF(szSourceDirectoryName)-1 >= iSourceDirectoryNameLen, "Invalid!"); if (0 >= iSourceDirectoryNameLen) { DN_RETURN(1); } if (_T('\\') != szSourceDirectoryName[iSourceDirectoryNameLen-1]) { if (iSourceDirectoryNameLen < COUNT_OF(szSourceDirectoryName)-2) { // NULL ¹®ÀÚ Æ÷ÇÔ szSourceDirectoryName[iSourceDirectoryNameLen] = _T('\\'); szSourceDirectoryName[iSourceDirectoryNameLen+1] = _T('\0'); ++iSourceDirectoryNameLen; } else { DN_RETURN(1); } } DWORD dwRetVal = RemoveWork(szSourceDirectoryName, bCheckFileExist); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } // »èÁ¦Ã³¸® ¡æ µð·ºÅ丮 ³»ÀÇ ÆÄÀÏÀº ÀÌ¹Ì CDirectory::CopyWork() ¾È¿¡¼­ »èÁ¦µÇ¾î ÀÖÀ» °ÍÀÓ if (FALSE == ::RemoveDirectory(lpszSourceDirectoryName)) { DN_RETURN(::GetLastError()); } return(NOERROR); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::CheckFixDirectoryName //*--------------------------------------------------------------- // DESC : Copy / Move ¸¦ ¼öÇàÇÒ ¼ö ÀÖµµ·Ï ¿øº» / ¸ñÀû µð·ºÅ丮ÀÇ À̸§À» Á¶Á¤ // PARM : 1 . lpszSourceDirectoryNameIn - ¿øº» µð·ºÅ丮 (ÀÔ·Â) // 2 . lpszTargetDirectoryNameIn - ¸ñÀû µð·ºÅ丮 (ÀÔ·Â) // 3 . lpszSourceDirectoryNameOut - ¿øº» µð·ºÅ丮 (Ãâ·Â) // 4 . iSourceDirectoryNameOutSize - ¿øº» µð·ºÅ丮 Å©±â (Ãâ·Â) // 5 . lpszTargetDirectoryNameOut - ¸ñÀû µð·ºÅ丮 (Ãâ·Â) // 6 . iTargetDirectoryNameOutSize - ¸ñÀû µð·ºÅ丮 Å©±â (Ãâ·Â) // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::CheckFixDirectoryName( LPCTSTR lpszSourceDirectoryNameIn, LPCTSTR lpszTargetDirectoryNameIn, LPTSTR lpszSourceDirectoryNameOut, const INT iSourceDirectoryNameOutSize, LPTSTR lpszTargetDirectoryNameOut, const INT iTargetDirectoryNameOutSize ) { DN_ASSERT(NULL != lpszSourceDirectoryNameIn, "Invalid!"); DN_ASSERT(NULL != lpszTargetDirectoryNameIn, "Invalid!"); DN_ASSERT(NULL != lpszSourceDirectoryNameOut, "Invalid!"); DN_ASSERT(0 < iSourceDirectoryNameOutSize, "Invalid!"); DN_ASSERT(NULL != lpszTargetDirectoryNameOut, "Invalid!"); DN_ASSERT(0 < iTargetDirectoryNameOutSize, "Invalid!"); // CHECK_STRING(lpszSourceDirectoryNameIn, DF_DIR_MAX_PATH); // CHECK_STRING(lpszTargetDirectoryNameIn, DF_DIR_MAX_PATH); // ¸Å°³º¯¼ö üũ if (!lpszSourceDirectoryNameIn || !_tcscmp(lpszSourceDirectoryNameIn, _T(""))) { DN_RETURN(1); } if (!lpszTargetDirectoryNameIn || !_tcscmp(lpszTargetDirectoryNameIn, _T(""))) { DN_RETURN(1); } if (!lpszSourceDirectoryNameOut || !lpszTargetDirectoryNameOut) { DN_RETURN(1); } INT iSourceDirectoryNameLen = (INT)_tcslen(lpszSourceDirectoryNameIn); DN_ASSERT(0 < iSourceDirectoryNameLen, "Invalid!"); DN_ASSERT(iSourceDirectoryNameOutSize-1 >= iSourceDirectoryNameLen, "Invalid!"); if (0 >= iSourceDirectoryNameLen) { DN_RETURN(1); } STRNCPY(lpszSourceDirectoryNameOut, iSourceDirectoryNameOutSize, lpszSourceDirectoryNameIn); INT iTargetDirectoryNameLen = (INT)_tcslen(lpszTargetDirectoryNameIn); DN_ASSERT(0 < iTargetDirectoryNameLen, "Invalid!"); DN_ASSERT(iTargetDirectoryNameOutSize-1 >= iTargetDirectoryNameLen, "Invalid!"); if (0 >= iTargetDirectoryNameLen) { DN_RETURN(1); } STRNCPY(lpszTargetDirectoryNameOut, iTargetDirectoryNameOutSize, lpszTargetDirectoryNameIn); if (_T('\\') != lpszSourceDirectoryNameOut[iSourceDirectoryNameLen-1]) { if (iSourceDirectoryNameLen < iSourceDirectoryNameOutSize-2) { // NULL ¹®ÀÚ Æ÷ÇÔ lpszSourceDirectoryNameOut[iSourceDirectoryNameLen] = _T('\\'); lpszSourceDirectoryNameOut[iSourceDirectoryNameLen+1] = _T('\0'); ++iSourceDirectoryNameLen; } else { DN_RETURN(1); } } if (_T('\\') != lpszTargetDirectoryNameOut[iTargetDirectoryNameLen-1]) { if (iTargetDirectoryNameLen < iTargetDirectoryNameOutSize-2) { // NULL ¹®ÀÚ Æ÷ÇÔ lpszTargetDirectoryNameOut[iTargetDirectoryNameLen] = _T('\\'); lpszTargetDirectoryNameOut[iTargetDirectoryNameLen+1] = _T('\0'); ++iTargetDirectoryNameLen; } else { DN_RETURN(1); } } CStringSet aSourceDirectoryName; // ¿øº» µð·ºÅ丮ÀÇ À̸§À» ÆÄ½ÌÇϱâ À§ÇÑ ¹®ÀÚ¿­ if (2 <= iSourceDirectoryNameLen) { if (_T(':') == lpszSourceDirectoryNameOut[1]) { // µå¶óÀÌºê ¹®ÀÚ¿­À» ³ªÅ¸³»´Â Ç¥½Ã°¡ ÀÖ´Ù¸é ½ºÅµ aSourceDirectoryName = &lpszSourceDirectoryNameOut[2]; } else { aSourceDirectoryName = lpszSourceDirectoryNameOut; } } else { aSourceDirectoryName = lpszSourceDirectoryNameOut; } CStringSet aSourceDirectoryToken1, aSourceDirectoryToken2; // ¿øº» µð·ºÅ丮ÀÇ À̸§À» ´ãÀ» ¹®ÀÚ¿­ BOOL bDoLoop = TRUE; INT nStrLength = aSourceDirectoryName.GetLength(); INT nStrIndex = 0; do { // ¿øº» µð·ºÅ丮 À̸§¿¡¼­ ÅäÅ« ÃßÃâ aSourceDirectoryToken1 = aSourceDirectoryName.Tokenize(m_szSourceDirectorySeperator, nStrIndex); if (!aSourceDirectoryToken1.IsEmpty()) { aSourceDirectoryToken2 = aSourceDirectoryToken1; } if (nStrLength <= nStrIndex) { // Á¤»óÀûÀÎ ÆÄ½Ì Á¾·á break; } } while(bDoLoop); // À̸§ÀÌ Á¸ÀçÇÑ´Ù¸é ¸ñÀû µð·ºÅ丮 À̸§ ¹®ÀÚ¿­¿¡ Ãß°¡ if (!aSourceDirectoryToken2.IsEmpty()) { INT iTargetDirectoryNameLen1 = (INT)_tcslen(lpszTargetDirectoryNameOut); STRNCAT(lpszTargetDirectoryNameOut, iTargetDirectoryNameOutSize, aSourceDirectoryToken2.Get()); STRNCAT(lpszTargetDirectoryNameOut, iTargetDirectoryNameOutSize, _T("\\")); INT iTargetDirectoryNameLen2 = (INT)_tcslen(lpszTargetDirectoryNameOut); DN_ASSERT(iTargetDirectoryNameLen2 == iTargetDirectoryNameLen1 + aSourceDirectoryToken2.GetLength() + 1, "String Length Not Mach!"); if (iTargetDirectoryNameLen2 != iTargetDirectoryNameLen1 + aSourceDirectoryToken2.GetLength() + 1) { DN_RETURN(1); } } return(NOERROR); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::CopyWork //*--------------------------------------------------------------- // DESC : Copy / Move ¸¦ ½ÇÁ¦·Î ¼öÇà, ÀÚ½ÅÀ» Àç±ÍÈ£Ãâ // PARM : 1 . lpszSourceDirectoryName - ¿øº» µð·ºÅ丮 // 2 . lpszTargetDirectoryName - ¸ñÀû µð·ºÅ丮 // 3 . bDoErase - ÀÛ¾÷ ¼öÇà Áß ¿øº» ÆÄÀÏ/µð·ºÅ丮 Á¦°Å ¿©ºÎ (TRUE - Move / FALSE - Copy) // 5 . bOverWrite - µ¤¾î¾²±â ¿©ºÎ (±âº»°ª FALSE) // 6 . bSubDirectory - ÇϺΠµð·ºÅ丮 Ž»ö¿©ºÎ (±âº»°ª FALSE) // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::CopyWork( LPCTSTR lpszSourceDirectoryName, LPCTSTR lpszTargetDirectoryName, BOOL bDoErase, BOOL bOverWrite, BOOL bSubDirectory ) { DN_ASSERT(NULL != lpszSourceDirectoryName, "Invalid!"); DN_ASSERT(NULL != lpszTargetDirectoryName, "Invalid!"); // CHECK_STRING(lpszSourceDirectoryName, DF_DIR_MAX_PATH); // CHECK_STRING(lpszTargetDirectoryName, DF_DIR_MAX_PATH); // È£Ã⠽à ¸Å°Üº¯¼öÀÎ µð·ºÅ丮 ¹®ÀÚ¿­ ¸¶¹«¸®¸¦ Æ÷ÇÔÇÑ Ã¼Å©°¡ º¸ÀåµÊÀ» ÀüÁ¦·Î ÇÔ DWORD dwRetVal; // ¸ñÀû µð·ºÅ丮 »ý¼º if (FALSE == ::CreateDirectory(lpszTargetDirectoryName, NULL)) { dwRetVal = ::GetLastError(); if (ERROR_ALREADY_EXISTS != dwRetVal) { // ÁöÁ¤µÈ À§Ä¡¿¡ µð·ºÅ丮¸¦ »ý¼ºÇÒ ¼ö ¾øÀ½ DN_RETURN(dwRetVal); } } // ¿øº» µð·ºÅ丮ÀÇ º¹»ç/À̵¿ ÇÒ ÆÄÀÏ/µð·ºÅ丮 µé Ž»ö TCHAR szSourceDirectoryFindFiles[DF_DIR_MAX_PATH] = { _T('\0'), }; STRCPY(szSourceDirectoryFindFiles, COUNT_OF(szSourceDirectoryFindFiles), lpszSourceDirectoryName); STRNCAT(szSourceDirectoryFindFiles, COUNT_OF(szSourceDirectoryFindFiles), _T("*.*")); CDirectory aDirectory; dwRetVal = aDirectory.Begin(szSourceDirectoryFindFiles); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } while(NOERROR == dwRetVal) { // º¹»çÀÛ¾÷ ¼öÇà if (aDirectory.IsDirectory()) { // µð·ºÅ丮 if (bSubDirectory && _T('.') != aDirectory.GetFindData().cFileName[0] ) { // ¿øº» µð·ºÅ丮¿Í ¸ñÀû µð·ºÅ丮ÀÇ ¹®ÀÚ¿­À» ÀçÁ¶Á¤ÇØ ÁÜ TCHAR szSourceDirectoryName[DF_DIR_MAX_PATH] = { _T('\0'), }; TCHAR szTargetDirectoryName[DF_DIR_MAX_PATH] = { _T('\0'), }; INT iDirectoryNameLen1, iDirectoryNameLen2; STRNCPY(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), lpszSourceDirectoryName); STRNCPY(szTargetDirectoryName, COUNT_OF(szTargetDirectoryName), lpszTargetDirectoryName); // ¿øº» µð·ºÅ丮 ¹®ÀÚ¿­ Á¶Á¤ iDirectoryNameLen1 = (INT)_tcslen(szSourceDirectoryName); STRCAT(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), aDirectory.GetFindData().cFileName); STRCAT(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), _T("\\")); iDirectoryNameLen2 = (INT)_tcslen(szSourceDirectoryName); DN_ASSERT(iDirectoryNameLen2 == iDirectoryNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName) + 1, "String Length Not Mach!"); if (iDirectoryNameLen2 != iDirectoryNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName) + 1) { DN_RETURN(1); } // ¸ñÀû µð·ºÅ丮 ¹®ÀÚ¿­ Á¶Á¤ iDirectoryNameLen1 = (INT)_tcslen(szTargetDirectoryName); STRCAT(szTargetDirectoryName, COUNT_OF(szTargetDirectoryName), aDirectory.GetFindData().cFileName); STRCAT(szTargetDirectoryName, COUNT_OF(szTargetDirectoryName), _T("\\")); iDirectoryNameLen2 = (INT)_tcslen(szTargetDirectoryName); DN_ASSERT(iDirectoryNameLen2 == iDirectoryNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName) + 1, "String Length Not Mach!"); if (iDirectoryNameLen2 != iDirectoryNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName) + 1) { DN_RETURN(1); } // ÇÏÀ§ µð·ºÅ丮ÀÇ º¹»ç/À̵¿ ÀÛ¾÷ ÁøÇà dwRetVal = CopyWork( szSourceDirectoryName, szTargetDirectoryName, bDoErase, bOverWrite, bSubDirectory ); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } // »èÁ¦Ã³¸® ¡æ µð·ºÅ丮 ³»ÀÇ ÆÄÀÏÀº ÀÌ¹Ì CDirectory::CopyWork() ¾È¿¡¼­ »èÁ¦µÇ¾î ÀÖÀ» °ÍÀÓ if (bDoErase && FALSE == ::RemoveDirectory(szSourceDirectoryName) ) { DN_RETURN(::GetLastError()); } } } else { // ÆÄÀÏ // ¿øº» ÆÄÀϰú ¸ñÀû ÆÄÀÏÀÇ ¹®ÀÚ¿­À» »ý¼ºÇØ ÁÜ TCHAR szSourceFileName[DF_DIR_MAX_PATH] = { _T('\0'), }; TCHAR szTargetFileName[DF_DIR_MAX_PATH] = { _T('\0'), }; INT iFileNameLen1, iFileNameLen2; STRNCPY(szSourceFileName, COUNT_OF(szSourceFileName), lpszSourceDirectoryName); STRNCPY(szTargetFileName, COUNT_OF(szTargetFileName), lpszTargetDirectoryName); // ¿øº» ÆÄÀÏ ¹®ÀÚ¿­ »ý¼º iFileNameLen1 = (INT)_tcslen(szSourceFileName); STRCAT(szSourceFileName, COUNT_OF(szSourceFileName), aDirectory.GetFindData().cFileName); iFileNameLen2 = (INT)_tcslen(szSourceFileName); DN_ASSERT(iFileNameLen2 == iFileNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName), "String Length Not Mach!"); if (iFileNameLen2 != iFileNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName)) { DN_RETURN(1); } // ¸ñÇ¥ ÆÄÀÏ ¹®ÀÚ¿­ »ý¼º iFileNameLen1 = (INT)_tcslen(szTargetFileName); STRCAT(szTargetFileName, COUNT_OF(szTargetFileName), aDirectory.GetFindData().cFileName); iFileNameLen2 = (INT)_tcslen(szTargetFileName); DN_ASSERT(iFileNameLen2 == iFileNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName), "String Length Not Mach!"); if (iFileNameLen2 != iFileNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName)) { DN_RETURN(1); } // ÆÄÀÏ º¹»ç DWORD dwCopyFlag = (bOverWrite)?(0):(COPY_FILE_FAIL_IF_EXISTS); if (FALSE == ::CopyFileEx(szSourceFileName, szTargetFileName, NULL, NULL, FALSE, dwCopyFlag)) { dwRetVal = ::GetLastError(); if (ERROR_FILE_EXISTS != dwRetVal && ERROR_ALREADY_EXISTS != dwRetVal ) { // ÁöÁ¤µÈ À§Ä¡¿¡ µð·ºÅ丮¸¦ »ý¼ºÇÒ ¼ö ¾øÀ½ DN_RETURN(dwRetVal); } } // »èÁ¦Ã³¸® if (bDoErase && FALSE == ::DeleteFile(szSourceFileName) ) { DN_RETURN(::GetLastError()); } } dwRetVal = aDirectory.Next(); if (NOERROR != dwRetVal && ERROR_NO_MORE_FILES != dwRetVal) { // ¿¡·¯ ¹ß»ý aDirectory.End(); DN_RETURN(dwRetVal); } } aDirectory.End(); return(NOERROR); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CDirectory::RemoveWork //*--------------------------------------------------------------- // DESC : Remove ¸¦ ½ÇÁ¦·Î ¼öÇà, ÀÚ½ÅÀ» Àç±ÍÈ£Ãâ // PARM : 1 . lpszSourceDirectoryName - ¿øº» µð·ºÅ丮 // 2 . bCheckFileExist - ÆÄÀÏÀÌ Á¸ÀçÇÏ¸é µð·ºÅ丮¸¦ Á¦°ÅÇÏÁö ¾ÊÀ»Áö ¿©ºÎ (±âº»°ª TRUE) // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // PRGM : B4nFter //*--------------------------------------------------------------- DWORD CDirectory::RemoveWork(LPCTSTR lpszSourceDirectoryName, BOOL bCheckFileExist) { DN_ASSERT(NULL != lpszSourceDirectoryName, "Invalid!"); // CHECK_STRING(lpszSourceDirectoryName, DF_DIR_MAX_PATH); // È£Ã⠽à ¸Å°Üº¯¼öÀÎ µð·ºÅ丮 ¹®ÀÚ¿­ ¸¶¹«¸®¸¦ Æ÷ÇÔÇÑ Ã¼Å©°¡ º¸ÀåµÊÀ» ÀüÁ¦·Î ÇÔ DWORD dwRetVal; // ¿øº» µð·ºÅ丮ÀÇ º¹»ç/À̵¿ ÇÒ ÆÄÀÏ/µð·ºÅ丮 µé Ž»ö TCHAR szSourceDirectoryFindFiles[DF_DIR_MAX_PATH] = { _T('\0'), }; STRCPY(szSourceDirectoryFindFiles, COUNT_OF(szSourceDirectoryFindFiles), lpszSourceDirectoryName); STRNCAT(szSourceDirectoryFindFiles, COUNT_OF(szSourceDirectoryFindFiles), _T("*.*")); CDirectory aDirectory; dwRetVal = aDirectory.Begin(szSourceDirectoryFindFiles); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } while(NOERROR == dwRetVal) { // º¹»çÀÛ¾÷ ¼öÇà if (aDirectory.IsDirectory()) { // µð·ºÅ丮 if (_T('.') != aDirectory.GetFindData().cFileName[0]) { // ¿øº» µð·ºÅ丮¿Í ¸ñÀû µð·ºÅ丮ÀÇ ¹®ÀÚ¿­À» ÀçÁ¶Á¤ÇØ ÁÜ TCHAR szSourceDirectoryName[DF_DIR_MAX_PATH] = { _T('\0'), }; INT iDirectoryNameLen1, iDirectoryNameLen2; STRNCPY(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), lpszSourceDirectoryName); // ¿øº» µð·ºÅ丮 ¹®ÀÚ¿­ Á¶Á¤ iDirectoryNameLen1 = (INT)_tcslen(szSourceDirectoryName); STRCAT(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), aDirectory.GetFindData().cFileName); STRCAT(szSourceDirectoryName, COUNT_OF(szSourceDirectoryName), _T("\\")); iDirectoryNameLen2 = (INT)_tcslen(szSourceDirectoryName); DN_ASSERT(iDirectoryNameLen2 == iDirectoryNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName) + 1, "String Length Not Mach!"); if (iDirectoryNameLen2 != iDirectoryNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName) + 1) { DN_RETURN(1); } // ÇÏÀ§ µð·ºÅ丮ÀÇ º¹»ç/À̵¿ ÀÛ¾÷ ÁøÇà dwRetVal = RemoveWork(szSourceDirectoryName, bCheckFileExist); if (NOERROR != dwRetVal) { DN_RETURN(dwRetVal); } // »èÁ¦Ã³¸® ¡æ µð·ºÅ丮 ³»ÀÇ ÆÄÀÏÀº ÀÌ¹Ì CDirectory::CopyWork() ¾È¿¡¼­ »èÁ¦µÇ¾î ÀÖÀ» °ÍÀÓ if (FALSE == ::RemoveDirectory(szSourceDirectoryName)) { DN_RETURN(::GetLastError()); } } } else { // ÆÄÀÏ if (bCheckFileExist) { // ÀÌ ¿É¼ÇÀÌ ÀÖÀ¸¸é ÆÄÀÏÀÌ Á¸ÀçÇÒ ¶§ µð·ºÅ丮¸¦ Á¦°ÅÇÏÁö ¾ÊÀ½ DN_RETURN(1); } // ¿øº» ÆÄÀϰú ¸ñÀû ÆÄÀÏÀÇ ¹®ÀÚ¿­À» »ý¼ºÇØ ÁÜ TCHAR szSourceFileName[DF_DIR_MAX_PATH] = { _T('\0'), }; INT iFileNameLen1, iFileNameLen2; STRNCPY(szSourceFileName, COUNT_OF(szSourceFileName), lpszSourceDirectoryName); // ¿øº» ÆÄÀÏ ¹®ÀÚ¿­ »ý¼º iFileNameLen1 = (INT)_tcslen(szSourceFileName); STRCAT(szSourceFileName, COUNT_OF(szSourceFileName), aDirectory.GetFindData().cFileName); iFileNameLen2 = (INT)_tcslen(szSourceFileName); DN_ASSERT(iFileNameLen2 == iFileNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName), "String Length Not Mach!"); if (iFileNameLen2 != iFileNameLen1 + (INT)_tcslen(aDirectory.GetFindData().cFileName)) { DN_RETURN(1); } // »èÁ¦Ã³¸® if (FALSE == ::DeleteFile(szSourceFileName)) { DN_RETURN(::GetLastError()); } } dwRetVal = aDirectory.Next(); if (NOERROR != dwRetVal && ERROR_NO_MORE_FILES != dwRetVal) { // ¿¡·¯ ¹ß»ý aDirectory.End(); DN_RETURN(dwRetVal); } } aDirectory.End(); return(NOERROR); }