CFtpConnection连接FTP(转)

转载 2008年10月29日 19:31:00
 
要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。

MFC中的类CFtpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,我们需要先创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器的通信,我们不需要直接创建CFtpConnection对象,而是通过调用CInternetSession::GetFtpConnection来完成这项工作。它创建CFtpConnection对象并返回一个指向该对象的指针。

Ftp连接类的信息

下面我们简要介绍连接类的信息

CInternetSession对象
CInternetSession(LPCTSTR pstrAgent,DWORD dwConText ,DWORD dwAccessType,LPCTSTR pstrProxyName,LPCTSTR pstrProxyBypass,DWORD dwFlags);

在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将创始化内部数据结构,以备将来在应用程序中调用。如果dwFlags包含INTERNET_FLAG_ASYNC,那末从这个句柄派生的所有的句柄,在状态回调例程注冊之前,都会出现异步状态。如果沒有打开Internet连接,CInternetSession就会抛出一个例外,AfxThorowInternetException。


GetFtpConnection()函数
CFtpConnection* CIternetSession::GetFtpConnection(LPCTSTR pstrServer,LPCTSTR pstrUserName,LPCTSTR pstrPassword,INTERNET_PORT nPort,BOOL bPassive);

调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。如果打算读写文件,必须进行分步操作。关于查找,打开和读/写文件的信息需参考CFtpConnection和CFtpFileFind类。

对这个函数的调用返回一个指向CFtpConnection对象的指针。如果调用失败,检查抛出的CInternetException对象,就可以确定失败的原因。


GetFile()函数
BOOL GetFile(LPCTSTR pstrRemoteFile,LPCTSTR pstrLocalFile,BOOL bFailExists ,DWORD dwAttributes,DWORD dwFlags,DWORD dwContext);

调用这个成员函数,可以从FTP服务器取得文件,并且把文件保存在本地机器上。GetFile()函数是一个比较高级的例程,它可以处理所有有关从FTP服务器读文件,以及把文件存放在本地机器上的工作。如果dwFlags为FILE_TRANSFER_TYPE_ASCII,文件数据的传输也会把控制和格式符转化为Windows中的等阶符号。默认的传输模式是二进制模式,文件会以和服务器上相同的格式被下载

pstrRemoteFile和 pstrLocalFile可以是相对于当前目录的部分文件名,也可以是全文件名,在这两个名字中间,都既可以用反斜杠(/)或者正斜杠(/)来作为文件名的目录分隔符,GetFile()在使用前会把目录分隔符转化为适当的字符。

可以用自己选择的值来取代dwContext默认的值,设置为上下文标识符与CFtpConnection对象的定位操作有关,这个操作由CFtpConnection中的CInternetSession对象创建。返回给CInternetSession::OnStatusCallBack的值指出了所标识操作的状态。

如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。


PutFile()函数
BOOL PutFile(LPCTSTR pstrLocalFile, LPCTSTR pstrRemoveFile ,DWORD dwFlags, DWORD dwContext);

调用这个成员函数可以把文件保存到FTP服务器。PutFile()函数是一个比较高级的例程,它可以处理有关把文件存放到服务器上的工作。只发送数据,或要严格控制文件传输的应用程序,应该调用OpenFile和 CInternet::Write。利用自己选择的值来取代dwContext默认的值,设置为上下文标识符,上下文标识符是CInternetSession对象创建的CFtpConnection对象的特定操作有关,这个值返回给CInternetSession::OnStateCallBack,从而把操作的状态通报给它所标识的上下文。

如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。
下面这个函数是我写的一个例子。供参考
/************************************************************************/
/*
参数说明:
FtpPath   要下载的ftp 目录或文件
localPath    保存到本地的目录
ftpAdd       ftp地址
ftpSuser   登陆ftp的用户名
ftpPass       登陆ftp的密码
sErr          发生错误时,返回的错误信息*/
                                                       
/************************************************************************/
BOOL GetFileFromFTP( CString FtpPath, CString LocalPath ,CString ftpAdd, CString ftpUser, CString ftpPass, CString &sErr )
{
CString sTemp ;
CString sLocalTemp ;
CString sTempFtpPath ;
CInternetSession pInternetCon(AfxGetAppName(),1,PRE_CONFIG_INTERNET_ACCESS);
CFtpConnection *pFtpCon ;
try
{
   pFtpCon =pInternetCon.GetFtpConnection( ftpAdd, ftpUser, ftpPass, 21 );
   if ( pFtpCon != NULL)
   {
    CFtpFileFind FtpFinder( pFtpCon ) ;
    BOOL bWork = FtpFinder.FindFile( FtpPath );
    while ( bWork )
    {
     bWork = FtpFinder.FindNextFile() ;
     if ( FtpFinder.IsDots() )
      continue;
     if(FtpFinder.IsDirectory() )
     { //是目录
      sTemp.Empty() ;
      sTemp = FtpFinder.GetFileName() ;
      sTempFtpPath.Empty() ;
      sTempFtpPath = FtpPath.Left( FtpPath.GetLength() - 3 ) ;
      sTempFtpPath += sTemp + "//*.*" ;
      sLocalTemp.Empty() ;
      sLocalTemp = LocalPath + "//" + sTemp ;
      CFileStatus   rStatus;
      if( !( CFile::GetStatus( sLocalTemp, rStatus ) ) )
      {//文件夹不存在, 创建之
       if( !(CreateDirectory((LPCTSTR)sLocalTemp, NULL)) )
       {//创建失败
        DWORD dErr = GetLastError() ;
        sErr.Format( "创建新目录失败: ERROR %d" ,dErr ) ;
        return FALSE ;
       }
      }
      GetFileFromFTP( sTempFtpPath, sLocalTemp, ftpAdd, ftpUser, ftpPass, sErr ) ;
     }
     else
     {
      sTemp.Empty() ;
      sTemp = FtpFinder.GetFileName();
      sLocalTemp.Empty() ;
      sLocalTemp = LocalPath + "//" + sTemp ;
      sTemp.Empty() ;
      sTemp = FtpFinder.GetFilePath();//
      CFileStatus   rStatus;
      if( !( CFile::GetStatus( sLocalTemp, rStatus ) ) )
      {//文件不存在,下载之
       if( !( pFtpCon->GetFile( sTemp, sLocalTemp, true, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 1) ) )
       {//下载失败
        DWORD dErr = GetLastError() ;
        sErr.Format( "下载失败: ERROR %d" ,dErr ) ;
        return FALSE ;
       }
      }
     }
    }
    FtpFinder.Close() ;
     }      
}
catch (CInternetException * pEx)
{
   TCHAR szError[1024];
   pEx->GetErrorMessage(szError,1024) ;
   sErr.Format( "连接FTP失败:%s", pEx ) ;
   pEx->Delete();
   pFtpCon=NULL;
   return FALSE ;
}
return TRUE ;
}

MFC中的类CFtpConnection 实现ftp

---- MFC中的类CFtpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支 持的三个Internet功能之一,我们...
  • sky04
  • sky04
  • 2010年07月02日 14:20
  • 8693

使用MFC类CInternetSession和CFtpConnection构建FTP客户端

#pragma once #include #include #define FTP_DEFAULT_PORT 21 struct FileProperty { CString strFi...
  • xuweilmy
  • xuweilmy
  • 2013年06月25日 22:42
  • 2004

利用MFC的CFtpConnection类实现递归下载文件夹

一、用到的CInternetSession、CFtpConnection类的接口 接口名称 输入 输出 功能说明 CInternetSession::GetFtpConnection()...
  • leonardohq
  • leonardohq
  • 2015年11月16日 14:09
  • 1245

FTP断点续传VC-OCX--CFtpConnection

  • 2010年08月25日 11:45
  • 45KB
  • 下载

JAVA中使用FTPClient实现FTP上文件的操作

Java通过Apache的工具类
  • dzy784858512
  • dzy784858512
  • 2014年11月19日 11:47
  • 24603

CInternetSessio和CFtpConnection连接FTP

要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与...
  • weikangc
  • weikangc
  • 2015年06月01日 17:19
  • 1647

使用PutFile函数上传本机ip文件到FTP服务器

包含的头文件#include "winsock.h"#include "stdio.h"消息响应函数代码:  WORD wVersionRequested;WSADATA wsaData;char n...
  • lj19851227
  • lj19851227
  • 2010年09月08日 10:14
  • 2163

使用CFtpconnection类实现文件的断点续传的问题

 下面是我写的下载和上传的线程,其中下载时无法改变服务器端的读文件指针,只是改变了本地文件指针,所以只有读前面已下部分时不写,这样可以提高一点速度,但还是不算断点续传.而上传就更难以实现了.下面的程序...
  • wh825554
  • wh825554
  • 2006年09月05日 11:45
  • 2378

CFtpConnection::GetFile和使用实例

调用该成员函数获取从FTP服务器的文件并将其存储在本地计算机上。 BOOL GetFile( LPCTSTR pstrRemoteFile, LPCTSTR pstrLocalF...
  • bojie5744
  • bojie5744
  • 2014年07月13日 08:07
  • 1906

通过WinInet上传文件

// test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include...
  • qq51931373
  • qq51931373
  • 2013年11月28日 16:46
  • 1129
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CFtpConnection连接FTP(转)
举报原因:
原因补充:

(最多只允许输入30个字)