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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VC是一种常用的开发平台,可以用来实现各种功能,包括FTP文件下载。在VC中,可以使用WinINet API来实现FTP下载功能。 首先,我们需要在VC中添加相应的头文件和链接库。头文件包括<Windows.h>和<Wininet.h>,链接库为wininet.lib。 接下来,我们需要使用一些关键函数来实现FTP下载。首先是InternetOpen函数,用于初始化WinINet库,并创建一个用于FTP操作的会话句柄。然后,使用InternetOpenUrl函数来打开FTP服务器上的文件,获取到文件的句柄。接着,使用InternetReadFile函数来读取文件内容,并将其写入本地文件中。最后,使用InternetCloseHandle函数关闭句柄,释放资源。 具体实现代码如下所示: ```c++ #include <Windows.h> #include <Wininet.h> void DownloadFTPFile(const char* ftpUrl, const char* localFile) { HINTERNET hInternet = InternetOpen(L"FTPDownloader", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); if (hInternet == NULL) { return; } HINTERNET hFtpSession = InternetOpenUrlA(hInternet, ftpUrl, NULL, 0, INTERNET_FLAG_RELOAD, 0); if (hFtpSession == NULL) { InternetCloseHandle(hInternet); return; } HANDLE hLocalFile = CreateFileA(localFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (hLocalFile == INVALID_HANDLE_VALUE) { InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); return; } char buffer[4096]; DWORD bytesRead; while (InternetReadFile(hFtpSession, buffer, sizeof(buffer), &bytesRead) && bytesRead > 0) { DWORD bytesWritten; WriteFile(hLocalFile, buffer, bytesRead, &bytesWritten, NULL); } CloseHandle(hLocalFile); InternetCloseHandle(hFtpSession); InternetCloseHandle(hInternet); } int main() { const char* ftpUrl = "ftp://example.com/path/to/ftpfile.txt"; const char* localFile = "C:\\localfile.txt"; DownloadFTPFile(ftpUrl, localFile); return 0; } ``` 以上是一个简单的VC程序,用于实现FTP文件下载功能。在使用时,只需将FTP服务器的URL和本地文件的路径传递给DownloadFTPFile函数即可。程序将会从FTP服务器上下载文件,并保存到本地文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值