www.pudn.com > WZ_UpdateModule_DLL.rar > FtpUpdate.cpp


 
#include "WZ_UM.h" 
#include "ReadScript.h" 
 
WZ_DECLAREDLL CWZFtpUpdateModule::CWZFtpUpdateModule () 
{ 
	m_hUpdateThread = NULL; 
	m_hCheckThread = NULL; 
	m_nCheckThreadID = 0; 
	m_bConnected = FALSE; 
 
} 
 
 
WZ_DECLAREDLL CWZFtpUpdateModule::CWZFtpUpdateModule (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS) 
	: CWZUpdateModule (lpszIPADDR, wPORT, lpszID, lpszPASS) 
{ 
	m_hUpdateThread = NULL; 
	m_hCheckThread = NULL; 
	m_nCheckThreadID = 0; 
	m_bConnected = FALSE; 
} 
 
 
WZ_DECLAREDLL CWZFtpUpdateModule::~CWZFtpUpdateModule () 
{ 
	 
} 
 
 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::Connect () 
{ 
	AddEvent( EVENT_CONNECTING ); 
 
	m_iCurrentState = STATE_CONNECTING; 
 
	// error check 
	if (! strcmp (m_szIPADDR, "")) 
	{ 
		m_iCurrentState = STATE_DISCONNECTED; 
		return FALSE; 
	} 
	if (! m_wPORT) 
		m_wPORT = PORT_FTP; 
 
	m_hINET_SESSION = InternetOpen("UPDATE_FTP", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 
	if (m_hINET_SESSION == NULL) 
	{ 
		// "ÀÎÅÍ³Ý ¿¬°á ½ÇÆÐ" 
		m_iCurrentState = STATE_DISCONNECTED; 
		SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
		return FALSE; 
	} 
	 
	m_hFTP_CONNECTION =InternetConnect(m_hINET_SESSION, m_szIPADDR, m_wPORT, m_szID, m_szPASS, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); 
	if (m_hFTP_CONNECTION==NULL) 
	{ 
		// "FTP ¿¡ Á¢¼ÓÇÒ ¼ö ¾ø½À´Ï´Ù." 
		InternetCloseHandle(m_hINET_SESSION); 
		m_iCurrentState = STATE_DISCONNECTED; 
		AddEvent( EVENT_CONNECT_FAIL ); 
		return FALSE; 
	} 
 
	m_iCurrentState = STATE_CONNECTED; 
	m_bConnected = TRUE; 
 
	AddEvent( EVENT_CONNECT_SUCCESS ); 
 
	//Connect Check Thread 
	/* 
	m_nCheckThreadID = 2; 
	m_hCheckThread = (HANDLE) _beginthreadex (NULL, NULL, CheckConnectThread, (LPVOID) this, 0, &m_nCheckThreadID); 
	if (m_hCheckThread == INVALID_HANDLE_VALUE) 
	{ 
		if (m_lpFN_EventCallbackProc) 
		{ 
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
			return FALSE; 
		} 
	} 
	*/ 
 
	return TRUE; 
} 
 
 
 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::Connect (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS) 
{ 
	strcpy (m_szIPADDR, lpszIPADDR); 
	m_wPORT = wPORT; 
 
	if (!lpszID) 
		strcpy (m_szID, ""); 
	else 
		strcpy (m_szID, lpszID); 
 
	if (!lpszPASS) 
		strcpy (m_szPASS, ""); 
	else 
		strcpy (m_szPASS, lpszPASS); 
 
	return this->Connect(); 
} 
 
 
//ÀÌ ºÎºÐÀº StartUpdate¸¦ È£ÃâÇßÀ»¶§¿Í  
//È£ÃßÇÏÁö ¾Ê¾ÒÀ» ¶§·Î ±¸ºÐÇØ¾ß µÇÁö ¾ÊÀ»±î? 
WZ_DECLAREDLL VOID CWZFtpUpdateModule::Disconnect () 
{ 
	m_iCurrentState = STATE_DISCONNECTED; 
 
	m_bCancelUpdate = TRUE; 
	m_bUseEventProc = FALSE; 
 
	BOOL bPass = FALSE; 
 
	WaitForSingleObject( m_hUpdateThread, 1000 ); 
 
	if( m_hFTP_CONNECTION ) 
	{		 
		InternetCloseHandle(m_hFTP_CONNECTION); 
		m_hFTP_CONNECTION = NULL; 
	} 
 
	if( m_hINET_SESSION ) 
	{ 
		InternetCloseHandle(m_hINET_SESSION); 
		m_hINET_SESSION = NULL; 
	}	 
 
	m_bCancelUpdate = FALSE; 
	m_bUseEventProc = TRUE; 
	if( m_bConnected ) 
	{ 
		AddEvent( EVENT_DISCONNECT ); 
		m_bConnected = FALSE; 
	} 
} 
 
 
//lpszLocalPath : ÆÄÀÏÀ̸§ÀÌ Æ÷ÇÔµÇÁö ¾ÊÀº ¼ø¼öÇÑ ·ÎÄà °æ·Î 
//lpszRemoteFilePath : ÆÄÀÏÀ̸§ÀÌ Æ÷ÇÔµÈ °æ·Î 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::DownloadFile (LPSTR lpszRemoteFilePath, LPSTR lpszLocalPath) 
{ 
	eRESULT_CONSTANT eResult; 
	HANDLE		hLocalFile = INVALID_HANDLE_VALUE; 
	HINTERNET	hFTP_FILE = NULL; 
 
	//1. ¿ø°Ý¼­¹ö °æ·Î¸¦ ºÐ¼®ÇÑ´Ù. 
	CHAR		lpszRemoteDir[MAX_PATH]; 
	CHAR		lpszRemoteFileName[MAX_PATH]; 
	GetSplitFilePath( lpszRemoteFilePath, lpszRemoteDir, lpszRemoteFileName ); 
 
	// 2. ÇÔ¼öÀ̸§ : MakeLocalFileName 
	CHAR		lpszRealLocalFilePath [MAX_PATH]; 
	GetLocalFileName( lpszLocalPath, lpszRemoteFileName, lpszRealLocalFilePath ); 
 
	//3. ÆÄÀÏ »óÅ ±¸Á¶Ã¼¿¡ ÇöÀç ¹ÞÀ» ÆÄÀÏÀ̸§ ÀúÀå 
	ZeroMemory(m_strtUpdatingFileInfo.szFileName, sizeof(m_strtUpdatingFileInfo.szFileName) ); 
	strcpy( m_strtUpdatingFileInfo.szFileName, lpszRemoteFileName ); 
 
	__try 
	{ 
		hLocalFile = MakeLocalFile( lpszRealLocalFilePath ); 
		if(hLocalFile == NULL) 
			return FALSE; 
 
		////////////////////////////////////////////////////////////////////////// 
		// ¿ø°ÝÁö ÀÛ¾÷ Æú´õ ¼³Á¤ 
		SetRemoteDirectory( lpszRemoteDir ); 
 
		////////////////////////////////////////////////////////////////////////// 
		// ¿ø°ÝÁö ÆÄÀÏÁ¤º¸ ¾ò±â 
		DWORD dwFileLength = 0; 
		FILETIME fileTime; 
		BOOL bRet = GetRemoteFileInfo( lpszRemoteFileName, dwFileLength, fileTime ); 
		if( bRet == FALSE )		// TRUE¸¦ Çϴ°ÍÀº FALSE¸¦ ¸®ÅÏÇÒ °æ¿ì ERROR¸¦ ¹ß»ýÇϱ⠶§¹®ÀÌ´Ù. 
			return FALSE;			// ±Ô¾à¿¡ ÆÄÀÏÀÇ Å©±â°¡ 0ÀΰÍÀº ´Ù¿î·Îµå ÇÏÁö ¾Ê´Â´Ù´Â °ÍÀ» Æ÷ÇÔÇÏÀÚ. 
 
		////////////////////////////////////////////////////////////////////////// 
		// ·ÎÄÿ¡ ¼­¹ö¿¡¼­ ´Ù¿î ¹ÞÀ¸·Á´Â ÆÄÀÏÀÌ ÀÖ´ÂÁö ºñ±³.. ÆÄÀÏ À̸§/³¯Â¥ ºñ±³ 
 
		////////////////////////////////////////////////////////////////////////// 
		// 3 . ¿ø°ÝÁö ÆÄÀÏ ¿­±â 
		hFTP_FILE = OpenRemoteFile( lpszRemoteFileName ); 
		if( hFTP_FILE == NULL ) 
		{ 
			DeleteFile (lpszRealLocalFilePath); 
			return FALSE;			// ÆÄÀÏ Çϳª¸¸ ½ÇÆÐÇØµµ ´Ù¿î·Îµå¸¦ ¸ØÃã´Ù. 
		} 
 
		// »óÅ ¾Ë¸² »ç¿ëÀÚ ÇÔ¼ö°¡ ÁöÁ¤µÇ¾ú´Ù¸é ¿©±â·Î ÇöÀçÀÇ »óŸ¦ ¾Ë¸°´Ù.(´Ù¿î·Îµå ½ÃÀÛ) 
		AddEvent( EVENT_FILEDOWNLOAD_START ); 
 
		////////////////////////////////////////////////////////////////////////// 
		// ¿ø°ÝÁö ÆÄÀÏ ¾ò±â 
		eResult = GetRemoteFile( hFTP_FILE, hLocalFile, dwFileLength ); 
		if( eResult != RESULT_DOWNLOAD_SUCCESS ) 
		{ 
			// ÆÄÀÏ ¾ò±â¿¡ ½ÇÆÐÇϸé, ÇöÀç ¸¸µé¾îÁø ·ÎÄà ÆÄÀϵµ »èÁ¦ÇÑ´Ù. 
			DeleteFile (lpszRealLocalFilePath); 
			return FALSE; 
		} 
 
		//·ÎÄÃÆÄÀÏ¿¡ ½Ã°£ ¼³Á¤ 
		SetFileTime(hLocalFile, NULL, NULL, &fileTime); 
 
		// »óÅ ¾Ë¸² »ç¿ëÀÚ ÇÔ¼ö°¡ ÁöÁ¤µÇ¾ú´Ù¸é ¿©±â·Î ÇöÀçÀÇ »óŸ¦ ¾Ë¸°´Ù.(´Ù¿î·Îµå ³¡) 
		AddEvent( EVENT_FILEDOWNLOAD_END ); 
	} 
	__finally 
	{ 
		if (hFTP_FILE) 
			InternetCloseHandle(hFTP_FILE); 
		if (hLocalFile != INVALID_HANDLE_VALUE) 
			CloseHandle(hLocalFile); 
	} 
 
	return TRUE; 
} 
 
 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::GetSplitFilePath(const char* pszFilePath, char* pszDir, char* pszFile) 
{ 
	char		pszFileName[MAX_PATH]; 
	char		pszFileExt[MAX_PATH]; 
 
	//¿©±â¼­ ¼­¹öÆú´õ Á¶°ÇÀÌ µû¸¥´Ù.  
	//¼­¹öÀÇ Æú´õ´Â ·çÆ®¿¡¼­ ÇÏÀ§ 1´Ü°è ±îÁö¸¸ Á¸ÀçÇÑ´Ù. 
	_splitpath(pszFilePath, NULL, pszDir, pszFileName, pszFileExt ); 
	if(pszDir == NULL || (strcmp(pszDir, "")  == 0) ) 
		wsprintf(pszDir, "\\");	 
 
	wsprintf( pszFile, "%s%s", pszFileName, pszFileExt); 
 
	return TRUE; 
} 
 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::GetLocalFileName(const char* pszLocalPath, const char* pszRemoteFileName, char* pszLocalFilePath) 
{ 
	// ¿©±â¼­ ·ÎÄà ÆÄÀÏÀ̸§ÀÌ ¾ø´Ù¸é ¿ø°ÝÆÄÀÏÀ̸§°ú µ¿ÀÏÇÏ°Ô ¸¸µç´Ù. 
	if ( (!pszLocalPath) || (! strcmp(pszLocalPath, ""))) 
		wsprintf(pszLocalFilePath, ".\\%s", pszRemoteFileName); 
	else 
	{ 
		// ³¡¿¡ \ ÀÌ ÀÖ´ÂÁö ¾ø´ÂÁö °Ë»çÇØ¼­ Àû¿ëÇÑ´Ù. 
		if (pszLocalPath[strlen(pszLocalPath)-1] != '\\') 
			wsprintf (pszLocalFilePath, "%s\\%s", pszLocalPath, pszRemoteFileName ); 
		else  
			wsprintf (pszLocalFilePath, "%s%s", pszLocalPath, pszRemoteFileName); 
	} 
 
	return TRUE; 
} 
 
 
WZ_DECLAREDLL HANDLE CWZFtpUpdateModule::MakeLocalFile(const char* pszLocalFilePath) 
{ 
	//if( _access(pszLocalFilePath, 0) == 0 ) //¸¸ÀÏÇöÁ¦ ·ÎÄÃÆÄÀÏÀÌ Á¸ÀçÇϸé. 
	//{ 
	//	BOOL bRet = DeleteFile (pszLocalFilePath); 
	//	if(bRet == FALSE) 
	//	{ 
	//		MessageBox (NULL, "ÆÄÀÏ»èÁ¦ ½ÇÆÐ", "¸Þ¼¼Áö", MB_OK); 
	//	} 
	//} 
 
	HANDLE hLocalFile = CreateFile(pszLocalFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 
 
	if (hLocalFile == INVALID_HANDLE_VALUE) 
	{ 
		SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
		MessageBox (HWND_DESKTOP, this->GetLastErrorMsg(), "Local File Create Error", MB_OK); 
		return NULL; 
	} 
 
	return hLocalFile; 
} 
 
//pszRemoteDirÀº ·çÆ®¿¡ .\ ÀÌ·± °ÍÀÌ ¾ÈºÙ´Â´Ù. 
//pszRemoteDirÀº ·çÆ®¿¡¼­ ºÎÅÍÀÇ °æ·ÎÀÌ´Ù. 
//·çÆ®´Â ¾Æ¹«°Íµµ ¾È ºÙ´Â´Ù. 
//¸¸ÀÏ .\AgentServer\\sss °æ·Î¿¡ ÀÖ´Â sss Æú´õ¸¦ ¼¼ÆÃÇÏ°í ½ÍÀ¸¸é.. 
//pszRemoteDirÀº AgentServer\\sss ÀÌ µÇ¾î¾ß ÇÑ´Ù. 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::SetRemoteDirectory(const char* pszRemoteDir) 
{ 
	DWORD dwSize = 128; 
	BOOL bSuccess = FALSE; 
 
	//1. ·çÆ®·Î ¼³Á¤ 
	bSuccess = FtpSetCurrentDirectory( m_hFTP_CONNECTION, "/" );	 
	bSuccess = FtpSetCurrentDirectory( m_hFTP_CONNECTION, pszRemoteDir ); 
 
	if(!bSuccess) 
	{ 
		//MessageBox( NULL, szDir, "ÇöÀçµð·ºÅ丮", MB_OK ); 
		// Á¦ÀÏ Ã³À½ »©°í´Â ´ç¿¬È÷ ½ÇÆÐÇÑ´Ù. 
		// ½ÇÆÐÇÏ´Â ÀÌÀ¯´Â ÇöÀçµð·ºÅ丮´Â " /00.00.04 " ÀÌ·±½ÄÀ¸·Î ¼³Á¤µÇ¾î Àִµ¥, 
		// ³»°¡ ¼³Á¤ÇÒ µð·ºÅ丮´Â ".\00.00.04\ " ÀÌ·±½ÄÀ¸·Î ¼³Á¤ÇÏ·Á°í ÇÑ´Ù. 
		// ¸¸ÀÏ ÀÌ·¸°Ô Çϸé /00.00.04/00.00.04 µð·ºÅ丮¸¦ ã°Ô µÇ¹Ç·Î  
 
		//DWORD dwError; 
		//char szMsg[128]; 
		//DWORD nSize = sizeof(szMsg); 
		//InternetGetLastResponseInfo( &dwError, szMsg, &nSize ); 
		//MessageBox( NULL, szMsg, NULL, MB_OK ); 
	} 
	else 
	{ 
		//MessageBox( NULL, szDir, "ÇöÀçµð·ºÅ丮", MB_OK ); 
		//MessageBox( NULL, lpszRemoteDir, "¹Ù²Ü µð·ºÅ丮", MB_OK ); 
	} 
 
	return bSuccess; 
} 
 
 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::GetRemoteFileInfo(const char* pszRemoteFile, DWORD& dwFileLength, FILETIME& fileTime) 
{ 
	dwFileLength = 0; 
	WIN32_FIND_DATA	wfd; 
 
	//°í»ýÇß´Ù... --+++ 
	//FtpFindFirstFile ÀÌ ÇÔ¼ö´Â (µÎ¹øÂ° ÀÎÀÚ¿¡ ¹«¾ùÀ» ³Öµç..) ¹«Á¶°Ç ÇöÀç ¼¼ÆÃµÈ µð·ºÅ丮ÀÇ Á¦ÀÏù¹øÂ° ÆÄÀÏ(¶Ç´Â µð·ºÅ丮) 
	//À̸§À» °¡Áö°í ¿Â´Ù. ù¹øÂ° ÆÄÀÏ(µð·ºÅ丮) Á¤º¸´Â wfd¿¡ ÀúÀåµÈ´Ù. 
	//ÆÄÀÏÀÌ ¾øÀ¸¸é NULL ÀÌ ¸®ÅϵȴÙ. 
	HINTERNET hFind = ::FtpFindFirstFile(m_hFTP_CONNECTION, "*.*", &wfd, 0, 0); 
 
	if( hFind == NULL ) 
	{ 
		INT iErrno = GetLastError(); 
		if (iErrno != ERROR_INTERNET_EXTENDED_ERROR) 
		{ 
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, iErrno); 
			return -1;  //Çڵ鿡 ¹®Á¦°¡ ÀÖ´Â °æ¿ìÀÌ´Ù. 
		} 
	} 
	else 
	{ 
		BOOL bRet = FALSE; 
 
		do 
		{ 
			// ¿ø°ÝÁöÀÇ ÆÄÀÏÀ̸§°ú, ÇöÀç ãÀº ÆÄÀÏÀ̸§ÀÌ °°´Ù¸é... 
			if( strcmp(wfd.cFileName, pszRemoteFile) == 0 ) 
			{ 
				dwFileLength = wfd.nFileSizeLow; 
				fileTime = wfd.ftLastWriteTime; 
				bRet = TRUE; 
				break; 
			} 
 
		}while(	bRet = InternetFindNextFile( hFind, &wfd ) ); 
 
		if(bRet == FALSE)  //ÆÄÀÏÀ» ãÁö ¸øÇѰæ¿ì 
		{ 
			if( ERROR_NO_MORE_FILES == GetLastError() ) 
			{ 
				TCHAR szMsg[128]; 
				_snprintf( szMsg, 128, "%s ÆÄÀÏÀÌ ¾ø½À´Ï´Ù.", pszRemoteFile ); 
				MessageBox( NULL, szMsg, NULL, MB_OK ); 
			} 
 
			return FALSE; 
		} 
		else  // ÆÄÀÏÀº ã¾Ò´Âµ¥..  
		{ 
			if( wfd.dwFileAttributes != FILE_ATTRIBUTE_NORMAL ) 
			{ 
				char szError[128]; 
				wsprintf(szError, "¹öÀüÁ¤º¸ ÆÄÀÏÀ» ÀÐÀ»¼ö ¾ø½À´Ï´Ù. ÆÄÀÏ ¼Ó¼º = %d", wfd.dwFileAttributes ); 
				MessageBox( NULL, szError, NULL, MB_OK ); 
				InternetCloseHandle(hFind); 
				return FALSE; 
			} 
		} 
 
		InternetCloseHandle(hFind); 
	} 
 
	return TRUE; 
} 
 
 
WZ_DECLAREDLL HINTERNET CWZFtpUpdateModule::OpenRemoteFile(const char* pszRemoteFile) 
{ 
	HINTERNET hRemoteFile; 
 
	INT iCount = MAX_RETRY_DOWNLOADING; 
 
	while(iCount--) 
	{ 
		hRemoteFile = ::FtpOpenFile(m_hFTP_CONNECTION, pszRemoteFile, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY | 
			INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE, 0);//(DWORD)this); 
 
		if( hRemoteFile == NULL )  
		{ 
			// ¿¡·¯ 
			m_strtUpdatingFileInfo.iErrorCode = GetLastError(); 
			Sleep(100); 
		} 
		else  
		{ 
			break; 
		} 
	} 
 
	if( iCount  < 1 ) 
	{ 
		// ÆÄÀÏÀ» ãÀ»¼ö ¾ø´Ù. 
		AddEvent( EVENT_FILE_NOTFOUND ); 
		return NULL; 
	} 
 
	return hRemoteFile; 
} 
 
//¿ø°ÝÁö¿¡ ÀÖ´Â ÆÄÀÏÀ» °¡Á®¿Â´Ù.(´Ù¿î·Îµå ÇÑ´Ù.) 
WZ_DECLAREDLL eRESULT_CONSTANT CWZFtpUpdateModule::GetRemoteFile(const HINTERNET hRemoteFile, const HANDLE hLocalFile, DWORD dwFileLength) 
{ 
	DWORD dwNowRecvBytes, dwNowWrittenBytes, dwTotalWrittenBytes; 
	dwNowRecvBytes = dwNowWrittenBytes = dwTotalWrittenBytes = 0; 
 
	m_strtUpdatingFileInfo.uWholeFileSize = dwFileLength; 
	m_strtUpdatingFileInfo.uNowFileSize = 0; 
 
	int nZeroCount = 0; 
 
	if(dwFileLength > 0)		 
	{ 
		while(TRUE) 
		{ 
			if ( !InternetReadFile(hRemoteFile, m_FTP_cBUFFER, sizeof(m_FTP_cBUFFER), &dwNowRecvBytes) ) 
			{ 
				SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
				MessageBox (HWND_DESKTOP, "InternetReadFile() error", "¿¡·¯¿¡·¯", MB_OK); 
				ZeroMemory( m_FTP_cBUFFER, MAX_BUFFER ); 
				return RESULT_DOWNLOAD_FAIL; 
			} 
 
			if( dwNowRecvBytes == 0) 
				nZeroCount++; 
 
			if( nZeroCount >= 2) 
			{ 
				AddEvent( EVENT_FILEDOWNLOAD_FAIL ); 
				return RESULT_DOWNLOAD_FAIL; 
			} 
 
			// ¸¸ÀÏ ÀÌ ·çƾÀ» ½ÇÇàÇÏ´Â µµÁß¿¡ FTP¼­¹ö¿Í ¿¬°áÀÌ ²÷¾îÁö¸é, Àú ÇÔ¼ö¿¡¼­ FALSE¸¦ ¸®ÅÏÇÏ´Â °ÍÀÌ  
			// ¾Æ´Ï¶ó, dwNowRecvBytes°¡ 0ÀÌ ¸®ÅϵȴÙ. ±×·¡µµ, ¿¡·¯°¡ ¾Æ´Ò¼öµµ ÀÖÀ¸¹Ç·Î, 2¹ø 0ÀÌ ³ª¿À¸é, 
			// ·çƾÀ» ºüÁ® ³ª¿À´Â °ÍÀ¸·Î ÇÑ´Ù. 
 
			if ( !WriteFile (hLocalFile, m_FTP_cBUFFER, dwNowRecvBytes, &dwNowWrittenBytes, NULL) ) 
			{ 
				SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
				MessageBox (HWND_DESKTOP, "WriteFile() error", "¿¡·¯¿¡·¯", MB_OK); 
				return RESULT_DOWNLOAD_FAIL; 
			} 
 
			dwTotalWrittenBytes += dwNowWrittenBytes; 
			m_strtUpdatingFileInfo.uNowFileSize = dwTotalWrittenBytes; 
 
			AddEvent( EVENT_FILEDOWNLOAD_WORKING ); 
 
			// ÇöÀç±îÁö ¾²¿©Áø ÆÄÀÏÀÇ ¿ë·®ÀÌ Àüü ÆÄÀÏÀÇ ¿ë·®º¸´Ù °°°Å³ª Å©´Ù¸é... 
			if ( dwTotalWrittenBytes >= dwFileLength) 
				break; 
 
			if( m_bCancelUpdate ) 
			{ 
				m_bCancelUpdate = FALSE;   
				return RESULT_DOWNLOAD_STOP; 
			} 
		} 
	} 
	else if(dwFileLength == 0) 
	{ 
		return RESULT_DOWNLOAD_SUCCESS; 
	} 
	else 
	{ 
		// ¿ø°ÝÁö ÆÄÀÏ Å©±â°¡ 0º¸´Ù ÀÛ´Ù. 
		SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
		return RESULT_DOWNLOAD_FAIL; 
	} 
 
	return RESULT_DOWNLOAD_SUCCESS; 
} 
 
 
 
//ÆÄÀÏ ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀϵéÀ» ´Ù¿î ¹Þ´Â´Ù. 
//¿ø·¡ ¸®½ºÆ®ÆÄÀÏ À̸§Àº °íÁ¤Àε¥.. ±×³É ÀÎÀÚ·Î ½áÁØ´Ù. 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::DownloadFilesOnFileList( char* pszRemoteDirPath ) 
{ 
	// ·ÎÄÿ¡ ¸®½ºÆ® ÆÄÀÏÀ» ´Ù¿î ¹Þ¾ÒÀ¸¸é, ¹Ýµå½Ã ½ÇÇàÆÄÀÏ °æ·Î¿¡ ÀÖ´Ù. µû¶ó¼­ À̸§¸¸ ½áÁØ´Ù. 
	if(( SMDFile = fopen( DEFAULT_FILELIST_FILE, "r" ) ) == NULL ) 
	{ 
		MessageBox (HWND_DESKTOP, "can't open update-list file", "error", MB_OK | MB_ICONERROR); 
		return FALSE; 
	} 
 
	string strLocalRelativeDirPath;  //·ÎÄà ÀúÀå µð·ºÅ丮 »ó´ë°æ·Î 
 
	// ÆÄÀÏ ¸®½ºÆ®¸¦ ºÐ¼®Çؼ­, ÆÄÀÏ ¸®½ºÆ®¿¡ ÀÖ´Â ÆÄÀϵéÀ» ´Ù¿î ¹Þ´Â ±¸¹®.. 
	while( TRUE ) 
	{ 
		SMDToken Token; 
		//GetTokenÇÏ°Ô µÇ¸é SMDFile¿¡ Á¤ÀÇµÈ ÆÄÀÏÀ» Àо Token°ú TokenString¿¡ °ªÀ» ¸®ÅÏÇÏ°Ô µÈ´Ù. 
		Token = (*GetToken)();		 
 
		if( Token == END )  
			break; 
 
		if( Token == NAME )		// ÆÄÀÏÀ̸§ÀÎ °æ¿ì 
		{ 
			// ¿ø°ÝÁö È£½ºÆ®ÀÇ Àüü°æ·ÎÀ̸§ 
			CHAR szCurrentRemoteFilePath[MAX_PATH]; 
			ZeroMemory( szCurrentRemoteFilePath, MAX_PATH ); 
			wsprintf(szCurrentRemoteFilePath, "%s\\%s", pszRemoteDirPath, TokenString); 
 
			string strAbsoluteDirPath; 
			GetLocalDownAbsoluteDir( strLocalRelativeDirPath, strAbsoluteDirPath ) ; 
 
			////////////////////////////////////////////////////////////////////////// 
			// ÇöÀç ÀÌ ÆÄÀÏÀ» ´Ù¿î ¹ÞÀºÀûÀÌ ÀÖ´ÂÁö üũ.. 
			// 1. ¼­¹öÆÄÀϰú ¶È°°Àº ·ÎÄÃÆÄÀÏÀÌ ÀÖ´ÂÁö üũ 
			string strLocalFilePath; 
			strLocalFilePath = strAbsoluteDirPath; 
			strLocalFilePath += TokenString; 
 
			BOOL bRet = CanDownloadFile( strLocalFilePath, TokenString ); 
			if(bRet == TRUE) //´Ù¿î·Îµå ÇØµµ µÈ´Ù¸é.. 
			{ 
				if ( !DownloadFile(szCurrentRemoteFilePath, const_cast(strAbsoluteDirPath.data()) ) ) 
					return FALSE; 
			} 
			else	//´Ù¿î·Îµå ÇÏÁö ¾Ê¾Æµµ µÈ´Ù¸é.. ÀÌ¹Ì Áö³­¹ø¿¡ ´Ù¿î ¹ÞÀº ÆÄÀÏÀÌ´Ù. 
				continue; 
 
			// ÆÄÀÏ ´Ù¿î·Îµå°¡ ¼º°øÇßÀ¸¹Ç·Î ÆÄÀÏ °³¼ö¸¦ Çϳª Áõ°¡½ÃÄÑ ÁØ´Ù. 
			m_strtUpdatingFileInfo.uNowFileNum++; 
 
		} 
 
		if( Token == NUMBER )	// Æú´õÀ̸§ÀÎ °æ¿ì 
		{ 
			// 0ÀÌ¸é Æú´õ¸¦ »ý¼ºÇ϶ó´Â ¸í·ÉÀ̹ǷÎ, 0 ´ÙÀ½¿¡ ³ª¿À´Â °ªÀ» Àоî¾ß ÇÑ´Ù. 
			// ±× °ªÀÌ Æú´õ ¸íÀÌ´Ù. 
			Token = (*GetToken)(); 
 
			strLocalRelativeDirPath = "\\"; 
			strLocalRelativeDirPath += TokenString; 
			string strAbsoluteDirPath; 
			GetLocalDownAbsoluteDir( strLocalRelativeDirPath, strAbsoluteDirPath ) ; 
 
			CreateDirectory (strAbsoluteDirPath.data(), NULL);				// ·ÎÄà µð·ºÅ丮 »ý¼º 
		} 
	} 
 
	return TRUE; 
} 
 
//·ÎÄà ÆÄÀϰú ¼­¹öÆÄÀÏÀ» ºñ±³ÇÏ¿© ´Ù¿î ¹ÞÀ»Áö ¾È ¹ÞÀ»Áö¸¦ °áÁ¤ÇÑ´Ù. 
//TRUE : ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù. 
//FALSE : ÆÄÀÏÀ» ´Ù¿î ¹ÞÁö ¾Ê´Â´Ù. 
WZ_DECLAREDLL BOOL CWZFtpUpdateModule::CanDownloadFile(string strLocalFilePath, string strRemoteFileName) 
{ 
	////////////////////////////////////////////////////////////////////////// 
	// ÇöÀç ÀÌ ÆÄÀÏÀ» ´Ù¿î ¹ÞÀºÀûÀÌ ÀÖ´ÂÁö üũ.. 
	// 1. ¼­¹öÆÄÀϰú ¶È°°Àº ·ÎÄÃÆÄÀÏÀÌ ÀÖ´ÂÁö üũ 
	HANDLE hFile = CreateFile( strLocalFilePath.data(), GENERIC_READ, FILE_SHARE_READ, 
		NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); 
 
	if( hFile != INVALID_HANDLE_VALUE )		//ÆÄÀÏÀÌ Á¸ÀçÇÑ´Ù. 
	{ 
		// 2. ¿ø°ÝÁö ÆÄÀÏ Á¤º¸  
		DWORD dwFileLength; 
		FILETIME fileTime, localFileTime; 
		GetRemoteFileInfo( strRemoteFileName.data(), dwFileLength, fileTime); 
 
		//3. ·ÎÄÃÆÄÀÏ Á¤º¸ Àоî¿À±â 
		GetFileTime( hFile, NULL, NULL, &localFileTime ); 
 
		// Á¤º¸¸¦ ´Ù ÀоúÀ¸´Ï, ÇÚµéÀ» ´Ý´Â´Ù. 
		CloseHandle( hFile ); 
 
		// µÎ ÆÄÀÏÀÇ ½Ã°£ÀÌ µ¿ÀÏÇÏÁö ¾Ê´Ù. 
		if( ( fileTime.dwHighDateTime != localFileTime.dwHighDateTime ) || 
			( fileTime.dwLowDateTime != localFileTime.dwLowDateTime ) ) 
		{ 
			return TRUE; 
		} 
		else  //½Ã°£¸¶Á® µ¿ÀÏÇÏ´Ù¸é... ÆÄÀÏÀÇ Å©±â ºñ±³ 
		{ 
			FILE* pFile = fopen(strLocalFilePath.data(), "r"); 
			long nLen = _filelength( _fileno(pFile) ); 
			fclose(pFile); 
			return FALSE; 
			if( nLen == dwFileLength)  //ÆÄÀÏÀÇ Å©±â°¡ °°´Ù¸é.. 
				return FALSE; //ÆÄÀÏÀ» ´Ù¿î ¹ÞÁö ¾Ê´Â´Ù. 
			else 
				return TRUE; 
		} 
	} 
	else  //ÆÄÀÏÀÌ Á¸Àç ÇÏÁö ¾ÊÀ¸¸é.. 
	{ 
		return TRUE;	 
	} 
 
	////////////////////////////////////////////////////////////////////////// 
} 
 
//¼­¹ö¿ÍÀÇ ¿¬°á »óŸ¦ üũÇÏ´Â ¾²·¹µå 
//¿¬°áÀ» üũÇÏ´Â ÇÔ¼ö°¡ ¾ø±â ¶§¹®¿¡ ÇöÀç ¼­¹öÀÇ µð·ºÅ丮¸¦ °¡Á®¿À´Â ÇÔ¼ö·Î üũÇÑ´Ù. 
WZ_DECLAREDLL unsigned __stdcall CWZFtpUpdateModule::CheckConnectThread(LPVOID lpParam) 
{ 
	CWZFtpUpdateModule* lpWZUM = (CWZFtpUpdateModule*) lpParam; 
 
	while( lpWZUM->m_bConnected ) 
	{ 
		Sleep(1000); 
 
		HINTERNET hConnection = InternetConnect( lpWZUM->m_hINET_SESSION, lpWZUM->m_szIPADDR, lpWZUM->m_wPORT, 
			lpWZUM->m_szID, lpWZUM->m_szPASS, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0); 
 
		if (hConnection == NULL)  //Ftp¿¡ ¿¬°áÇÒ¼ö ¾ø½À´Ï´Ù. 
		{ 
			lpWZUM->m_bConnected = FALSE; 
			char szError[512]; 
			wsprintf( szError, "¼­¹ö¿Í ¿¬°áÇÒ¼ö ¾ø½À´Ï´Ù. ErrorCode = %d", GetLastError() ); 
			MessageBox(NULL, szError, "¾Ë¸²", MB_OK); 
			lpWZUM->AddEvent( EVENT_DISCONNECT ); 
		} 
		else 
		{ 
			InternetCloseHandle( hConnection ); 
		} 
	} 
 
	return 0; 
}