MFC中的类CFtpConnection 实现ftp

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

Ftp连接类的信息

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

CInternetSession对象

---- CInternetSession(LPCTSTR pstrAgent,DWORD dwConText ,DWORD dwAccess Type,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(),确认出错的原因。

连接到FTP站点

---- 建立连接到ftp.microsoft.com的程序,它是一个单文档程序。并且连接由视图类的构造函数完成。

建立单文档程序ftp

在ftpview.h中加入包含#include < afxinet.h >

在ftpview.h中添加如下的成员变量

public:

CInternetSession *m_pInetSession;

CFtpConnection *m_pFtpConnection;

在ftpview.cpp中的ftpview构造函数中加入下面的 代码

CFtpView::CFtpView()

{

m_pInetSession=new CInternetSession

(AfxGetAppName(),1,

PRE_CONFIG_INTERNET_ACCESS);

try

{

m_pFtpConnection=m_pInetSession->

GetFtpConnection("FTP.MICROSOFT.COM");

}

catch(CInternetException *pEx)

{

TCHAR szError[1024];

if(pEx->GetErrorMessage(szError,1024))

AfxMessageBox(szError);

else

AfxMessageBox("There was an exception");

pEx->Delete();

m_pFtpConnection=NULL;

}

}

在ftpview.cpp中的ftpview析构函数中加入下面的 代码

CFtpView::~CFtpView()

{

if(m_pFtpConnection!=NULL)

{

m_pFtpConnection->Close();

delete m_pFtpConnection;

}

delete m_pInetSession;

}

编译并且执行程序,如果连接出现问题,将会在一个消息框中报告出错 消息。

发送文件到FTP文件服务器

---- 创建一个发送文件到FTP文件服务器的程序

建立单文档程序ftpfw, 在ftpfwview.h中加入包含 #include < afxinet.h >

在ftpfwview.h中添加如下的成员变量

public:

bool m_bConnectionAttempted;

int m_nFileStatus;

在ftpview.cpp中的ftpview构造函数中加入下面的 代码

CFtpfwView::CFtpfwView()

{

m_bConnectionAttempted=false;

}

使用ClassWizard加入新的类CFtpThread,该类 派生于CWinThread 在ftpthread.h中加入如下变量

public:

static UINT PutFile(LPVOID Status);

添加新类成员函数代码

UINT CFtpThread::PutFile(LPVOID Status)

{

int *pnFileStatus;

CInternetSession *pInetSession;

CFtpConnection *pFtpConnection=NULL;

pnFileStatus=(int *)Status;

*pnFileStatus=0;

pInetSession=new

CInternetSession(AfxGetAppName(),1,

PRE_CONFIG_INTERNET_ACCESS);

try

{

pFtpConnection=pInetSession->

GetFtpConnection("192.34.45.0");

}

catch(CInternetException *pEx)

{

pEx->Delete();

pFtpConnection=NULL;

*pnFileStatus=-1;

goto BallOut;

}

*pnFileStatus =1;

pFtpConnection->Remove("test.txt");

if(!pFtpConnection->PutFile

("test.txt","test.txt"))

*pnFileStatus=-2;

else

*pnFileStatus=2;

BallOut:

if(pFtpConnection!=NULL)

{

pFtpConnection->Close();

delete pFtpConnection;

}

delete pInetSession;

AfxEndThread(0);

return false;

}

编辑ftpfwview.cpp中的OnDraw()函数

void CFtpfwView::OnDraw(CDC* pDC)

{

CFtpfwDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

if(!m_bConnectAttempted)

{

m_bConnectAttempted=TRUE;

AfxBeginThread((AFX_THREADPROC)

CFtpThread::PutFile,&m_nFileStatus);

}

}

编译并且执行程序,在连接和传输的过程中,应用程序仍然可以作自己 的工作,这是因为传输的过程发生在线程中。

总结语

---- 通过以上的程序可以明白FTP的工作原理,可以编制自己的获得FTP服务器的文件以及获得FTP服务器的根目录。

 

PS:GetFile函数的前两个参数不能含有路径名,只能是文件名:

路径信息可以用pFtpConnection->SetCurrentDirectory和::SetCurrentDirectory分别 设置远程和本地的当前路径,~~呼呼

 

OK

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
MFC可以通过CFtpConnection类来实现FTP上传、下载、删除文件夹的操作。具体步骤如下: 1. 连接FTP服务器,使用CFtpConnection类的Connect函数连接FTP服务器。 2. 登录FTP服务器,使用CFtpConnection类的Login函数登录FTP服务器。 3. 切换工作目录,使用CFtpConnection类的SetCurrentDirectory函数切换到指定的工作目录。 4. 上传文件,使用CFtpConnection类的PutFile函数上传指定的文件。 5. 下载文件,使用CFtpConnection类的GetFile函数下载指定的文件。 6. 删除文件,使用CFtpConnection类的Remove函数删除指定的文件。 7. 删除文件夹,使用CFtpConnection类的RemoveDirectory函数删除指定的文件夹。 以下是一个简单的例子: ``` CFtpConnection ftp; CString serverName = _T("ftp.server_name.com"); CString userName = _T("user_name"); CString password = _T("password"); if (ftp.Connect(serverName, INTERNET_DEFAULT_FTP_PORT, userName, password)) { // 登录FTP服务器 ftp.Login(); // 切换工作目录 ftp.SetCurrentDirectory(_T("/folder_name")); // 上传文件 ftp.PutFile(_T("local_file_path"), _T("remote_file_name")); // 下载文件 ftp.GetFile(_T("remote_file_name"), _T("local_file_path")); // 删除文件 ftp.Remove(_T("remote_file_name")); // 删除文件夹 ftp.RemoveDirectory(_T("folder_name")); // 断开连接 ftp.Close(); } ``` 需要注意的是,CFtpConnection的函数都是同步的,即会阻塞当前线程直到操作完成。如果想要异步执行操作,可以使用CFtpFileFind类和CFtpTransaction类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值