/************************************************************************/
/*FTP下载指定的文件夹或文件
参数说明:
FtpPath 要下载的ftp 目录或文件
localPath 保存到本地的目录
ftpAddress ftp地址
ftpSuser 登陆ftp的用户名
ftpPass 登陆ftp的密码
sErr 发生错误时,返回的错误信息*/
/************************************************************************/
BOOL
GetFileFromFTP( CString FtpPath, CString LocalPath ,CString ftpAddress, CString ftpUser, CString ftpPass, CString &sErr )
{
CString sTemp ;
CString sLocalTemp ;
CString sTempFtpPath ;
CInternetSession pInternetCon(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
CFtpConnection *pFtpCon ;
try
{
pFtpCon =pInternetCon.GetFtpConnection( ftpAddress, ftpUser, ftpPass, 21 );
if
( pFtpCon != NULL)
{
CFtpFileFind FtpFinder( pFtpCon ) ;
BOOL
bWork = FtpFinder.FindFile( FtpPath );
while
( bWork )
{
bWork = FtpFinder.FindNextFile() ;
if
( FtpFinder.IsDots() )
continue
;
if
(FtpFinder.IsDirectory() )
{
//是目录
sTemp.Empty() ;
sTemp = FtpFinder.GetFileName() ;
sTempFtpPath.Empty() ;
sTempFtpPath = FtpPath;
sTempFtpPath += sTemp;
sTempFtpPath +=
"\\*.*"
;
sLocalTemp.Empty() ;
sLocalTemp = LocalPath + sTemp;
CFileStatus rStatus;
if
( !( CFile::GetStatus( sLocalTemp, rStatus ) ) )
{
//文件夹不存在, 创建之
if
( !(CreateDirectory((
LPCTSTR
)sLocalTemp, NULL)) )
{
//创建失败
DWORD
dErr = GetLastError() ;
sErr.Format( _T(
"创建新目录失败: ERROR %d"
) ,dErr ) ;
return
FALSE ;
}
}
GetFileFromFTP( sTempFtpPath, sLocalTemp, ftpAddress, ftpUser, ftpPass, sErr ) ;
}
else
{
sTemp.Empty() ;
sTemp = FtpFinder.GetFileName();
sLocalTemp.Empty() ;
sLocalTemp = LocalPath +
"\\"
+ sTemp ;
sTemp.Empty() ;
sTemp = FtpFinder.GetFilePath();
//
CFileStatus rStatus;
if
( !( CFile::GetStatus( sLocalTemp, rStatus ) ) )
{
//文件不存在,下载之
if
( !( pFtpCon->GetFile( sTemp, sLocalTemp,
true
, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 1) ) )
{
//下载失败
DWORD
dErr = GetLastError() ;
sErr.Format( _T(
"下载失败: ERROR %d"
) ,dErr ) ;
return
FALSE ;
}
}
}
}
FtpFinder.Close() ;
}
}
catch
(CInternetException * pEx)
{
TCHAR
szError[1024];
pEx->GetErrorMessage(szError,1024) ;
sErr.Format( _T(
"连接FTP失败:%s"
), szError) ;
pEx->Delete();
pFtpCon=NULL;
return
FALSE ;
}
return
TRUE ;
}