您现在的位置是:首页 > 正文

FTP开发中下载文件的两种方式

2024-04-01 00:59:44阅读 0

1. 通过 GetFile 方式下载
2. 通过 CInternetFile::Read 方式下载

两种方式的区别:
第一种方式,操作级别较高。直接调用就好,这种方式封装了一切操作。
第二种方式,自己可以控制。其基本原理,就是在网络上打开一个文件,就像本地打开文件一样。读取,然后写入到本地文件。

以下代码,两种方式都有,第二种方式注释掉了。打开即可使用。

在FTP下载中,碰到的奇异问题:
下载大于100M的文件。
今天,下载到最后一块,出现timeout。
在本地建立ftp良好。
在其他测试环境良好。
下一步,在另外一个计算机上建立ftp再测试下。确定是ftp服务器问题,还是客户端问题。
另外出问题的时候,用filezilla客户端下载,良好。

找到一个 FTP Client 类。使用后,再议。
http://www.codeproject.com/KB/IP/ftpclientclass.aspx

服务器端使用filezilla 。

5.15问题已解决,和信令无关。

bool DownloadFile(char *filename)
{
 CInternetSession* pInetSession; //会话对象
 CFtpConnection* pFtpConnection; //连接对象
 
 pInetSession=new CInternetSession(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
 
 try
 {
  //新建连接对象
  pFtpConnection=pInetSession->GetFtpConnection("127.0.0.1", "sa", "111");
 }
 catch(CInternetException *pEx)
 {
  //获取错误
  TCHAR szError[1024];
  if(pEx->GetErrorMessage(szError,1024))
   AfxMessageBox(szError);
  else 
   AfxMessageBox("There was an exception");
  pEx->Delete();
  
  return FALSE;
 }
 
 TCHAR tchBuffer[MAX_PATH];
 GetCurrentDirectory(MAX_PATH, tchBuffer);
 strcat(tchBuffer, filename + 1);
 
 
 if(pFtpConnection->GetFile(filename, "d:\\2.exe", false))
 {
  //AfxMessageBox("下载成功");
 }
 else
  DWORD dResult = GetLastError();

/* 
 CInternetFile *pInternetFile = pFtpConnection->OpenFile(filename, GENERIC_READ, FTP_TRANSFER_TYPE_BINARY, 1);
 char szBuffer[4096];

 CFile file("d:\\1.exe", CFile::modeWrite | CFile::modeCreate | CFile::typeBinary);
 UINT uRead;

 int count = 0;
 
 while (true)
 {
  try
  {
   uRead = pInternetFile->Read(szBuffer, 4096);
   ++count;
   TRACE2("%d %d\n", count, uRead);

  }
  catch (CInternetException *pEx)
  {
   //获取错误
   TCHAR szError[1024];
   if(pEx->GetErrorMessage(szError,1024))
    AfxMessageBox(szError);
   else 
    AfxMessageBox("There was an exception");
   
   pEx->Delete();
  }
  
  file.Write(szBuffer, uRead);

  if ( uRead < 4096 )
   break;
  
 }

 file.Close();
 pInternetFile->Close();
 delete pInternetFile; */

 if ( NULL != pFtpConnection )
  pFtpConnection->Close();
 delete pFtpConnection;
 delete pInetSession;

 return true;

}

第二种方式下载的函数
CString GetFTPFile(const char *ftpserver, const char *remotefile,
                      const char *localfile )
{
    TCHAR   szCause[255];
    CString sCause;
    sCause.Format(""); 
 
    try
    {
  TCHAR ftpAgent[256] = _T("FTPSource");
        //create the internet session

        CInternetSession mysession(ftpAgent,
   1,
   INTERNET_OPEN_TYPE_PRECONFIG,
   NULL,
   NULL,
     INTERNET_FLAG_DONT_CACHE);

        //get the ftp connection from internet session
        CFtpConnection* pFtpConn = mysession.GetFtpConnection(ftpserver,"sa","111");
       
        if(pFtpConn)
        {
   CFtpFileFind finder(pFtpConn);
   finder.FindFile(remotefile);
   finder.FindNextFile();
   
   FILE* fp = fopen(localfile,"wb");
   if(fp == NULL)
   {
    return "file open error";
   }
   __int64  _fileSize = finder.GetLength64();
   
   CInternetFile* _pFtpFile = pFtpConn->OpenFile(remotefile,
    GENERIC_READ,
    FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_DONT_CACHE,
    1);
   
   _pFtpFile->SetReadBufferSize(READSIZE);
   int i = 1;
            while(_fileSize > 0 )
   {
    char temp[READSIZE]= "\0";
    if(_fileSize > READSIZE)
    {
     
     _pFtpFile->Read((LPVOID)temp, READSIZE );     
     _fileSize = _fileSize - READSIZE;
     
     fwrite(temp,READSIZE,1,fp);
    }
    else
    {
     _pFtpFile->Read((LPVOID)temp, _fileSize );  
     fwrite(temp,sizeof(char),_fileSize,fp);
     _fileSize = 0;
    }
   }
   _pFtpFile->Close();
   fclose(fp);
        }
        else
        {
   //could not connect
   sCause.Format("Could not connect to ftp server!! \nPlease "
    "ensure you have correct address and access rights!");
        }     
    }
 
    catch(CException* error)
    {
        error->GetErrorMessage(szCause,254,NULL);
        sCause.Format("%s",szCause);
    }

    return (sCause);
}

网站文章

  • atoi()函数原型与itoa()函数原型

    1、atoi函数原型: #include using namespace std; int atio1(char *s) { int sign=1,num=0; if(*s==&#39;-&#39;) sign=-1; s++; while((*s)!=&#39;\0&#39;) { num=num*10+(*s-&#39;0&#39;); s++; }

    2024-04-01 00:59:20
  • 海量数据处理思想 + 一些例题

    海量数据,顾名思义就是数据量太大,内存里装不下,基本思路就是分治,借助一些合适的数据结构;下来看一下具体的例子一、bit-map:使用bit数组来表示元素是否存在,这样只需要存储比特位即可;1、如果有...

    2024-04-01 00:59:12
  • kafka可视化工具kafka tool

    kafka可视化工具kafka tool

    kafka tool官网下载地址http://www.kafkatool.com/download.html连接zookeeper服务地址其中message信息乱码,解决方案如下:1、点击tools—settings—选择topics中将key message设置为string2、选择指定的topic中properties将key message设置为string ...

    2024-04-01 00:59:05
  • Java中httpClient中三种超时设置

    本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结 在Apache的HttpClient包中,有三个设置超时的地方:/* 从连接池中取连接的超时时间*/ ConnManagerParams.setTimeout(params, 1000); /*连接超时*/ HttpConnectionParams.setConnectionTimeout(params, 2000)

    2024-04-01 00:58:41
  • 从微服务开始 vs 不从微服务开始

    从微服务开始 vs 不从微服务开始

    本文的题目看似自相矛盾,实则不然。 我想讲两个故事。一个是不从微服务开始,一个是从微服务开始。我认为,通过观察事物的两面,我们将对微服务的实际好处有更多的了解。 闲话少叙,言归正题。 不从微服务开始 ...

    2024-04-01 00:58:33
  • python引用另一个py的函数

    引用test.py的函数testafrom test import testatesta() 或者import testtest.testa()

    2024-04-01 00:58:26
  • VSCode 联合调试Python/C++

    VSCode 联合调试Python/C++

    本文选择Vscode实现Python/C++代码的联合调试,一是它跨平台,二是通过插件支持多语言代码编辑以及调试。在尝试ptvsd调试器失败后换用gdb调试器做讲解。

    2024-04-01 00:58:03
  • 《机器学习高频面试题详解》4.4:模型融合:Bagging

    机械工程师岗,18K x (14-16)薪,七成是基本工资,三成绩效,公积金12%,每月交通补助600元,每日餐补大约20元,试用期半年,试用期内工资80%,宿。三方违约金是一个月工资,但是我现在没有...

    2024-04-01 00:57:57
  • 计算机毕业设计/课程设计开题报告系列-基于JavaWeb的学生选课系统开题报告

    计算机毕业设计/课程设计开题报告系列-基于JavaWeb的学生选课系统开题报告

    本项目是一款基于JavaWeb的学生选课系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。

    2024-04-01 00:57:51
  • 为什么要用反射创建对象_为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?...

    为什么要用反射创建对象_为什么几乎所有的Java框架都要用到反射机制,她的魅力在哪里?...

    说起Java的反射机制,大家应该不陌生吧,她是Java语言多态的一种体现。但是在面试过程中,我发现很多人都只是停留在听说过的层面,并没有知其所以然,今天我们就来探讨下。大部分人最早接触的反射代码,是J...

    2024-04-01 00:57:43