posts - 126,  comments - 73,  trackbacks - 0

没什么技术难度.仅存之以备后用.


//////////////////////////////////////////////////////////////////////////////////
//DownLoadFile                 //
//功能:下载指定文件                //
//参数说明:                  //
//ftpurl:  Ftp链接地址              //
//acc:   登陆ftp的帐号             //
//psw:   登陆ftp的密码             //
//farfilename: 要下载的远程文件            //
//localpath: 本地用于保存文件的目录           //
//说明:指定文件要包含路径和文件名,路径中请使用"\\",不要用"/"做为分割符   //
//////////////////////////////////////////////////////////////////////////////////.
bool CFtpTestDlg::DownLoadFile(char *ftpurl, char * acc,
     char * psw, char * farfilename, char * localpath)
{
 //创建InternNet会话
 CInternetSession sess(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);

 CFtpConnection* pConnect = NULL; 
 CFtpFileFind *pftpfinder;
 try
 {
  //CString m_strFtpSite = "192.168.0.60";
  pConnect = sess.GetFtpConnection(ftpurl,acc,psw);
  pftpfinder = new CFtpFileFind(pConnect);

  BOOL bWorking = pftpfinder->FindFile(farfilename);
  if(bWorking)
  {
   CString localfilename(localpath);
   if(localfilename.Right(1)!="\\")
    localfilename += "\\";
   localfilename += ::PathFindFileName(farfilename);

   if(!pConnect->GetFile(farfilename,localfilename,0))
   {
    CString buf;
    buf.Format("下载文件出错;filename:%s,curlocaldir:%s",farfilename,localfilename);
    Log(buf.GetBuffer());
   }
   
  }
 // LoopDownloadDir(pConnect,pftpfinder,farpath);

 }
 catch (CInternetException* pEx)
 {
  TCHAR sz[1024];
  pEx->GetErrorMessage(sz, 1024);
  printf("ERROR!  %s\n", sz);
  pEx->Delete();
 }

 if(pftpfinder)
  delete pftpfinder;

 return true;

}


//////////////////////////////////////////////////////////////////////////////////
//DownLoadAllDirFile               //
//功能:下载指定文件夹下的内容             //
//参数说明:                  //
//ftpurl: Ftp链接地址               //
//acc:  登陆ftp的帐号              //
//psw:  登陆ftp的密码              //
//farpath: 要下载的远程目录             //
//localpath:本地用于保存文件的目录            //
//////////////////////////////////////////////////////////////////////////////////.
bool CFtpTestDlg::DownLoadAllDirFile(char *ftpurl,          
  char * acc, char * psw, char * farpath, char * localpath)
{
 //记录本地文件夹和要下载的远程文件夹
 m_strLocalDir = localpath;
 m_strFarDir = farpath;

 //创建InternNet会话
 CInternetSession sess(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);

 CFtpConnection* pConnect = NULL; 
 CFtpFileFind *pftpfinder;
 try
 {
  //CString m_strFtpSite = "192.168.0.60";
  pConnect = sess.GetFtpConnection(ftpurl,acc,psw);
  pftpfinder = new CFtpFileFind(pConnect);
  LoopDownloadDir(pConnect,pftpfinder,farpath);

 }
 catch (CInternetException* pEx)
 {
  TCHAR sz[1024];
  pEx->GetErrorMessage(sz, 1024);
  printf("ERROR!  %s\n", sz);
  pEx->Delete();
 }

 if(pftpfinder)
  delete pftpfinder;

 return true;

}
//////////////////////////////////////////////////////////////////////////////////
//LoopDownloadDir()                 //
//功能:递归下载目录内容                //
//参数说明:                   //
//pConnect:  Ftp链接指针               //
//pftpfinder: ftp文件查找指针              //
//dirpath:  递归目录               //
//////////////////////////////////////////////////////////////////////////////////.
bool CFtpTestDlg::LoopDownloadDir(CFtpConnection* pConnect,
     CFtpFileFind * pftpfinder,char * dirpath)
{
 //当前本地文件夹
 CString curlocaldir = m_strLocalDir;
 CString strbuf(dirpath);
 CString strbuf2 = strbuf.Right(strbuf.GetLength()-m_strFarDir.GetLength());
 if(strbuf2.Left(1) == "\\")  //去除最左边的"\\"
  strbuf2 =strbuf2.Right(strbuf2.GetLength()-1);
 curlocaldir = m_strLocalDir;
 if(curlocaldir.Right(1) != "\\")
  curlocaldir += "\\";
 curlocaldir += strbuf2;

 ////但前远程文件夹
 //CString curfardir = m_strFarDir;
 //if(m_strFarDir.Right(1) != "\\")
 // m_strFarDir+="\\";
 //curfardir += dirpath;


 //if(strlen(dirpath))
 // curlocaldir= m_strLocalDir + "\\" + dirpath;


 //查找任意文件
 CString allfile(dirpath);
 if(allfile.Right(1) != "\\")
  allfile += _T("\\");
 allfile += "*.*";
 BOOL bWorking = pftpfinder->FindFile(allfile);
 while(bWorking)
 {
  bWorking = pftpfinder->FindNextFile();
  CString filename = pftpfinder->GetFileName();
  Log("filename:%s",filename.GetBuffer());
  if(!pftpfinder->IsDirectory()) //文件,下载
  {
   Log("File :%s",filename.GetBuffer());
   //远程文件全名=远程目录+"\\"+文件名称
   CString farfilename(dirpath);
   if(farfilename.Right(1) != "\\")
    farfilename+="\\";
   farfilename += filename;
   //当地文件全名=当地目录+"\\"+文件名称
   CString localfilename=curlocaldir ;
   if(localfilename.Right(1) != "\\")
    localfilename+="\\";
   localfilename += filename;
   if(!pConnect->GetFile(farfilename,localfilename,0))
   {
    CString buf;
    buf.Format("下载文件出错;filename:%s,curlocaldir:%s",filename,curlocaldir);
    Log(buf.GetBuffer());
   }
  }
  else if(!pftpfinder->IsDots()) //子目录,递归下载
  {
   //定位当地子文件夹
   CString localsubdir = curlocaldir;
   if(localsubdir.Right(1) != "\\")
    localsubdir+="\\";
   localsubdir += filename;
   //定位远程子文件夹
   CString farsubdir = dirpath;
   if(farsubdir.Right(1) != "\\")
    farsubdir+="\\";
   farsubdir += filename;

   //查找并添加本地文件夹
   CFileFind   finder;  
   if(finder.FindFile(localsubdir)==FALSE)  
   {  
    if(!CreateDirectory(localsubdir,NULL))
     Log("Create dir flase! :%s",localsubdir);
   }  
   finder.Close();

   Log("Dir  :%s",localsubdir.GetBuffer());
            LoopDownloadDir(pConnect,pftpfinder,farsubdir.GetBuffer());
   bool bfint = pftpfinder->FindFile(allfile);
   //重新定位本层查找    //这里应该有更好的实现方法
   while(bfint)
   {
    bfint = pftpfinder->FindNextFile();
    if(pftpfinder->GetFileName() == filename)
     break;
   }
  }
 }
 return true;
}

posted on 2007-01-15 13:29 我风 阅读(3214) 评论(2)  编辑 收藏 引用

FeedBack:
# re: ftp下载实现
2011-02-26 00:02 | masmo
不错!借鉴了!多谢博主同学:P  回复  更多评论
  
# re: ftp下载实现
2012-10-19 11:00 | olive
但是不知怎么回事,总会在getFile函数时卡死,最后下载不成功。测试程序都是好的,一旦放到工程中就不行了  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(12)

随笔分类

随笔档案

文章档案

相册

收藏夹

C++

MyFavorite

搜索

  •  

积分与排名

  • 积分 - 319814
  • 排名 - 74

最新评论

阅读排行榜

评论排行榜