ftp下载实现

来源:互联网 发布:列车通信网络 编辑:程序博客网 时间:2024/06/05 16:25

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

////////////////////////////////////////////////////////////////////////////////////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;}