在VC中实现FTP功能

要联接到FTP服务器,需要两个步骤,首先必须创建一个CInternetSession对象,用类CInterSession创建并初始化一个或几个同时存在的Internet会话(session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的连接,可以创建一个CInternetSession对象作为类CWinApp的成员。 
---- MFC中的类CFtpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP是MFC的WinInet支持的三个Internet功能之一,我们需要先创建一个CInternetSession实例和一个CFtpConnection对象就可以实现和一个FTP服务器的通信,我们不需要直接创建CFtpConnection对象,而是通过调用CInternetSession::GetFtpConnection来完成这项工作。它创建CFtpConnection对象并返回一个指向该对象的指针。 
Ftp连接类的信息 
---- 下面我们简要介绍连接类的信息 
1.     CInternetSession对象 
---- CInternetSession(LPCTSTR pstrAgent,DWORD dwConText ,DWORD dwAccessType,LPCTSTR pstrProxyName,LPCTSTR pstrProxyBypass,DWORD dwFlags); 
---- 在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将创始化内部数据结构,以备将来在应用程序中调用。如果dwFlags包含INTERNET_FLAG_ASYNC,那末从这个句柄派生的所有的句柄,在状态回调例程注冊之前,都会出现异步状态。如果沒有打开Internet连接,CInternetSession就会抛出一个例外,AfxThorowInternetException。 
2.     GetFtpConnection()函数 
---- CFtpConnection* CIternetSession::GetFtpConnection(LPCTSTR pstrServer,LPCTSTR pstrUserName,LPCTSTR pstrPassword,INTERNET_PORT nPort,BOOL bPassive); 
---- 调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。如果打算读写文件,必须进行分步操作。关于查找,打开和读/写文件的信息需参考CFtpConnection和CFtpFileFind类。 
---- 对这个函数的调用返回一个指向CFtpConnection对象的指针。如果调用失败,检查抛出的CInternetException对象,就可以确定失败的原因。 
3.     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(),确认出错的原因。 
4.     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站点

#include <iostream>
using namespace std;
#include <string>
#include <afxinet.h>

void vt_downLoad(string filename, string pathname)
{
	CString filename1;
	filename1.Format("%s", filename.c_str());
	CString pathname1;
	pathname1.Format("%s", pathname.c_str());
	CInternetSession* pSession;     //定义会话对象指针变量

	CFtpConnection* pConnection;   //定义连接对象指针变量

	CFtpFileFind* pFileFind;          //定义文件查询对象指针变量

	CString strFileName;
	CString m_strFtp = "192.168.1.251";
	CString m_strName = "user";
	CString m_strPwd = "";
	char appName[256] = "nonameapp";

	BOOL bContinue;

	pConnection=NULL;      //初始化

	pFileFind=NULL;

	//UpdateData(TRUE);      // 获得用户的当前输入(服务器名,用户名和口令)

	//	while(m_listFile.GetCount()!=0) m_listFile.DeleteString(0);  // 清除列表框的内容

	pSession=new CInternetSession(          // 创建Internet会话类对象

		appName/*AfxGetAppName()*/,1,PRE_CONFIG_INTERNET_ACCESS);

	try 

	{  // 试图建立与指定FTP服务器的连接

		pConnection=

			pSession->GetFtpConnection(m_strFtp,m_strName,m_strPwd);

	}  catch (CInternetException* e)  {   

		e->Delete();                          // 无法建立连接,进行错误处理

		pConnection=NULL;

	}

	if (pConnection!=NULL)

	{// 创建CFtpFileFind对象,向构造函数传递CFtpConnection对象的指针

		pFileFind=new CFtpFileFind(pConnection);

		bContinue=pFileFind->FindFile("*");  // 查找服务器上当前目录的任意文件

		if (!bContinue)   // 如果一个文件都找不到,结束查找

		{

			pFileFind->Close();

			pFileFind=NULL;

		}


		//CString strSName = "d:\\output\\" + filename1;  //Media Express Manual.pdf";
		//CString strDName = "d:\\input\\" + pathname1 +"\\" + filename1;//"./Media Express Manual.pdf";

		CString strSName = "./" + filename1;  //Media Express Manual.pdf";
		CString strDName = "./" + filename1; //"./Media Express Manual.pdf";

		/*pConnection->GetFile(strSName,strDName);*///下载
		pConnection->PutFile(strSName, strDName);//上传

		if (pFileFind!=NULL)

		{

			pFileFind->Close();   // 结束查询

			pFileFind=NULL;

		}

	}

	delete pFileFind;              // 删除文件查询对象

	if (pConnection!=NULL)

	{

		pConnection->Close();

		delete pConnection;      // 删除FTP连接对象

	}

	delete pSession;             // 删除Internet 会话对象 
}

int main()
{
	vt_downLoad("3.ts", "123");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值