APP下载

基于MFC的FTP客户端的实现

2016-07-23李俊丽

山西电子技术 2016年2期

李俊丽

(晋中学院,山西 晋中 030619)



基于MFC的FTP客户端的实现

李俊丽

(晋中学院,山西 晋中 030619)

摘要:大部分浏览器客户端虽然具有使用方便的特点,但仅具有浏览文件和下载的功能,不具备文件上传和高级文件管理功能。针对这些问题,设计了一种基于MFC的FTP客户端,提供了基本的浏览文件和上传下载功能,而且具有简单可视化易操作等特点。

关键词:FTP客户端;MFC;WinInet类库

连接FTP服务器的方式有很多种,包括命令行、浏览器和专门的图形界面程序,但是这些程序的本质都是FTP客户端。命令行客户端资源占用小,但命令记忆工作复杂,只适合熟练的计算机用户。绝大部分浏览器支持FTP客户端连接。浏览器客户端具有使用方便的特点,但仅具有浏览文件和下载的功能,不具备文件上传和高级文件管理功能。专门的图形界面客户端不但界面友好,而且具有比较全面的文件上传下载功能,有的软件还有一定的文件管理等高级功能。

现在市面上FTP客户端种类繁多,软件规模有大有小,授权方式有商业软件、开源软件多种。国内FTP客户端软件主要以小型软件为主。现今的FTP客户端更加注重安全性、提高传输速度和提高稳定性,提供更加友好的图形界面。

1FTP客户端系统功能设计

一个运行在Windows下的简易FTP客户端应当包含以下几个基本的部分:图形界面,本地文件/远程文件浏览部分,信息反馈部分,文件传输部分[1]。

具体的讲,该程序的功能设计如下:

1) 登录注销模块,用于实现客户端与服务器的连接建立和连接断开,这是程序不可缺少的部分;

2) 本地文件浏览模块,用于显示和列出本地计算机特定目录下的文件和文件夹,实现文件目录的显示、跳转,用于选定本机上的特定文件;

3) 远程文件浏览模块,用于FTP服务器上的文件浏览操作,功能类似于本地文件浏览模块;

4) 信息反馈模块,用于滚动显示交互信息;

5) 文件传输模块,用于选定文件的上传下载,这是程序的重要部分;

6) 图形界面优化设计和帮助提示部分,包括启动画面和帮助系统。

2FTP客户端在MFC程序开发中的实现方式

设计一个基于MFC[2]的FTP客户端,解决程序核心部分的编程问题有两种设计方法:第一种方法,使用Win Socket套接字实现程序的数据通信和命令控制,并使用文件输入输出流解决文件传输问题;第二种方法,使用MFC类库当中提供的WinInet类库所包含的类及其封装函数,来实现FTP客户端中的常见操作[3]。

这两种方法相比较,第一种方法比较直接,执行效率高,深入底层,但是编程工作难度大,不易操作;第二种方法更易于实现,提高了软件重用率,大大降低了编程难度,避免了使用套接字和文件输入输出流等复杂操作,提高了编程效率。所以,本程序设计采用第二种方法。

WinInet类库不仅提供了常见的基于MFC的Internet客户端的编写解决方案,如HTTP、FTP等,还提供了连接远程服务器操作的相关类和函数,以及客户端和服务器数据传输的相关功能,用户不需要对TCP/IP协议编程和Win Socket套接字等有深入的了解。除此之外还提供了一整套能够安全处理网络连接、数据缓冲传输和异常处理的机制。WinInet类库在文件WININET.DLL中。在实际编程中,需要包含afxinet.h头文件来引入该类库[4]。

3FTP客户端程序的具体实现

3.1图形界面设计

本程序使用Visual Studio 2010中的VC++2010实现,是一个基于对话框的MFC应用程序。图形界面设计使用VC++2010的资源视图打开对话框资源,并使用类似于Visual Basic程序设计中拖放控件的方法设计程序的主界面。整体效果如图1所示。

图1 FTP客户端界面效果图

在控件布局完成后,为了方便编程,需要添加一系列的控件变量,并为其添加相应的资源ID号。其中添加的控件变量是程序对话框类CMyFTPClientDlg中的成员变量,详见表1。

表1 控件变量列表

其中控件变量的初始化操作由对话框类CMyFTPClientDlg中的成员函数DoDataExchange()完成,该函数由系统生成,函数内部调用DDX_Control函数来完成控件变量的初始化。

为了进一步方便编程,统一命名,需要将部分控件添加ID号,详见表2。

表2 控件资源ID列表

界面的细节包括了程序图标、启动画面和帮助按钮的事件响应三个部分。

自定义程序图标是将自制图标文件命名为<项目名称>.ico(此处MyFTPClient.ico),覆盖工程项目文件的res目录下的对应文件即可。该图标对应资源的ID号为系统默认的ID,即IDR_MAINFRAME,表示的是程序窗口图标和应用程序图标。

由于VC++2008及VC++2010没有添加启动画面的功能,需要手动通过代码方式添加启动画面。启动画面的添加过程如下:

1) 创建继承CWnd类的启动画面类CWASplash,重写其OnPaint()方法和OnCreate()方法,用于在窗体中加载启动画面。重写OnTimer()方法用于关闭启动画面;

2) 添加自定义位图资源用作启动画面;

3) 在对话框类的OnCreate()方法中添加启动画面对象,并调用其重写的OnCreate()方法创建启动画面窗口。刷新显示该窗口,并暂停代码执行一段时间后销毁启动画面窗口对象资源[5]。启动画面显示完成后继续进行主窗口(对话框)的创建。

帮助按钮功能的实现是通过响应“帮助”按钮的OnBnClick事件,执行打开一个文本文件的命令来完成的。使用了ShellExecute()函数,其代码如下:

void CMyFTPClientDlg::OnBnClickedBtnHelp()

{

ShellExecute(NULL,NULL,_T("Help.txt"),NULL,NULL,SW_SHOWNORMAL);

}

“关于”按钮的功能与“帮助”按钮功能类似,响应单击按钮事件,打开一个“关于”对话框,并且以模态方式打开。其中“关于”对话框是CaboutDlg类的一个类对象。

其中,信息显示模块的功能实现通过自定义函数ShowMsgLog(CString str)函数实现,用于消息文本框的信息显示。

3.2客户端与服务器的连接

根据MSDN文档的介绍,使用WinInet类库实现FTP客户端的主要过程有以下两个步骤[6]:

1) 开始Internet会话,创建CInternetSession对象,初始化WinInet并连接到服务器;

2) 连接到FTP服务器,使用CInternetSession::GetFtpConnection,返回CFtpConnection对象。

在实际编程中,在对话框类中创建一个成员变量pConn,类型为CFTPConnection的指针,在构造函数时指空,在连接时指向一个CFTPConnection对象。

连接断开的处理是:先调用CFTPConnection的Close()方法,然后pConn指空。若窗口关闭,对话框类调用析构函数,在析构函数中将pConn指空。连接和断开处理的代码是在对应按钮的单击事件处理函数OnBnClickedBtnConn()和OnBnClickedDisconn()中完成的[7]。

pConn指针对象的生命周期如图2所示。

图2 pConn指针对象的生命周期图

3.3服务器文件和本机文件的浏览

服务器文件(或本机文件)的浏览操作需要遍历远端服务器(或者是本地)的文件,并在各自的列表框中显示出来[8]。为了便于服务器文件目录(或者是本机的文件目录)的遍历操作与当前文件的选定,需要提前设定两个全局字符串变量sLocPath和sRmtPath记录当前路径。

根据MSDN文档,遍历查找FTP路径的方法是:

1) 创建一个CFTPFileFind对象;

2) 设定当前的路径为根路径,从根路径起,先使用CFTPFileFind类中的FindFile()方法找到第一个文件,之后循环使用FindNextFile()方法遍历当前目录,并将找到的文件添加到列表框中,也就是通过GetFileName()方法获取文件名,直至FindNextFile()方法返回FALSE为止。

显示远程文件列表功能由函数ShowRmtList(void)完成。其中使用IsDirectory()方法判断是不是文件夹。文件夹的表示应当区别于普通文件,本程序规定,文件夹使用“[文件名]”的方式,依据计算机上使用习惯,“[..]”表示上一级文件夹。

远程文件目录浏览跳转需要响应对列表框的双击事件,由函数OnLbnDblclkRmtflst()中的代码实现。对双击列表框对象进行响应时,需判断双击的是文件夹还是上层目录。若是文件夹,则对当前目录字符串追加当前双击选中的字符串;若是上级目录,则当前目录字符串回退查找至上一个“/”字符,并截断至此;若是普通文件,则不做操作。最后重新显示当前目录。

目录列表还需要响应选中事件,由消息处理函数OnLbnSelchangeRmtflst()完成,并获取当前选中远程文件的路径,并存储在全局字符串selectedRmtPath中。

本地文件浏览的原理与远程文件浏览的原理类似,遍历本机文件使用CfileFind对象中的相关方法,其函数的使用方式与远程文件浏览相关方法类似。但是需要特别注意Windows操作系统的文件系统表示方式和远程服务器上使用类UNIX的文件目录表示方式有很大不同。其中类UNIX操作系统文件系统根目录用“/”表示,然而Windows操作系统的文件路径的开头是“盘符:”的形式。本地文件目录的完成还需要选择驱动器盘符,需要调用GetLogicalDrives()这个Win32平台SDK函数(它不是MFC中封装的函数)。这个函数返回一个用二进制掩码表示的双字类型的值,用来表示驱动器盘符。获取驱动器盘符后经过转换转换成字符类型,逐个添加到下拉列表中。

同理,显示本机文件的相关函数有:显示本机列表函数ShowLocFiles(void),双击事件响应函数OnLbnDblclkLocflst(),列表项选中处理事件OnLbnSelchangeLocflst()(这个函数获取当前选中本地文件的路径,并存储在selectedLocPath全局字符串中)。

3.4文件传输

文件传输模块是本程序的重要组成部分,连接模块和文件浏览模块是文件传输模块的技术基础和技术准备。文件传输部分包括上传和下载,分别由上传按钮的单击事件处理函数OnBnClickedBtnUpld()和下载按钮的单击事件处理函数OnBnClickedBtnDnld()完成。上传函数PutFile()和下载函数GetFile()是CFTPConnection类的成员函数。在实际编程时,只需调用它们的重载函数,只填写前两个参数,即源文件和目标文件即可,其余参数均有默认值。

4结束语

本文设计了基于MFC的FTP客户端程序结构,阐述了使用MFC的WinInet类库开发Internet客户端的过程,并使用Visual C++ 2010编写了程序。但是本程序仅实现了FTP客户端的基本功能,对于程序的不足之处还需要在进一步的工作中加以改进。

参考文献

[1]吴珂.基于FTP协议客户端软件的实现[J].沈阳航空工业学院报,2008(4):39-42.

[2]MFC[EB/OL].http://baike.baidu.com/subview/10918/5039469.htm,2006.

[3]刘萍.FTP客户端软件的实现[J].黑龙江科技信息,2008(1):63-63.

[4]MSDN.Win32 Internet 扩展 (WinInet)[EB/OL].https://msdn.microsoft.com/zh-cn/library/3w2azyt6.aspx,2013.

[5]CSDN.给VS2008/VS2010 MFC项目添加启动画面[EB/OL].http://blog.csdn.net/libenqing/article/details/5961991,2010.

[6]MSDN.典型FTP客户端应用程序中的步骤[EB/OL].https://msdn.microsoft.com/zh-cn/library/hf9x9wb4.aspx,2009.

[7]谢鹏.FTP客户端程序的设计与应用[J].科技经济市场,2006(11):2-3.

[8]MSDN.Use the MFC FTP Classes[EB/OL].https://msdn.microsoft.com/zh-cn/visualc/cc506059(en-us).aspx,2010.

收稿日期:2015-11-23

作者简介:李俊丽(1982- ),女,山西高平人,讲师,硕士,研究方向:数据库与软件工程。

文章编号:1674- 4578(2016)02- 0043- 03

中图分类号:TP311

文献标识码:A

Implementation of FTP Client Based on MFC

Li Junli

(JinzhongUniversity,JinzhongShanxi030619,China)

Abstract:Although the most of browser client have the characteristics of easy to use, but also they only have the function of browsing the file and downloading and don’t have the functions of file uploading and senior management. This paper designs a FTP client application based on MFC, which provides the basic functions of browsing files, upload and download, and has the characteristics of simple visualization and easy to operate.

Key words:FTP Client; MFC; WinInet Class Libraries