1. 程式人生 > >ftp下載實現

ftp下載實現

沒什麼技術難度.僅存之以備後用.


//////////////////////////////////////////////////////////////////////////////////
//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 我風 閱讀(2633) 評論(2)  編輯 收藏 引用