ftp下载实现

来源:互联网 发布:javascript源码分析 编辑:程序博客网 时间:2024/06/13 07:15

转自:http://www.cppblog.com/kyelin/articles/17636.html

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

 InternetOpen 初始化 Win32 internet
InternetConnect 打开一个FTP, HTTP, or Gopher 应用会话
FtpCreateDirectory 在服务器上建立一个新的目录
FtpRemoveDirectory 删除服务器上的一个目录
FtpOpenFile 打开服务器上的一个文件进行读写
FtpGetFile 接收指定的文件并且在本地建立它
FtpPutFile 发送指定文件到服务器
FtpDeleteFile 删除服务器上一个指定的文件
FtpSetCurrentDirectory 设置服务器上当前的工作目录
FtpGetCurrentDirectory 返回服务器当前的工作目录
FtpCommand 发送命令到服务器
FtpFindFirstFile 返回文件信息。放在 WIN32_FIND_DATA 结构中
InternetFindNextFile 调用 FtpFindFirstFile()后在目录中连续查找
FtpRenameFile 修改服务器上指定的文件的名字 

也可以使用开源库,具体实现可以上网搜搜:

你用用C++的开源库POCO,只要下面的简单代码就可以实现FTP。。#include "Poco/Net/FTPClientSession.h"#include "Poco/Net/SocketAddress.h"#include "Poco/Net/NetException.h"。。。using Poco::Net::FTPClientSession;using Poco::Net::SocketAddress;using Poco::Net::FTPException;。。。FTPClientSession session(host, port);//创建FTP会话对象session.login(username, password); //登录session.setWorkingDirectory(path); //转到工作目录ostream& os= session.beginUpload(fileName);//指定远程文件名开始上传os << "test" ; //上传内容session.endUpload(); //结束上传
原创粉丝点击