李俊麗
(晉中學院,山西 晉中 030619)
?
基于MFC的FTP客戶端的實現(xiàn)
李俊麗
(晉中學院,山西 晉中 030619)
摘要:大部分瀏覽器客戶端雖然具有使用方便的特點,但僅具有瀏覽文件和下載的功能,不具備文件上傳和高級文件管理功能。針對這些問題,設(shè)計了一種基于MFC的FTP客戶端,提供了基本的瀏覽文件和上傳下載功能,而且具有簡單可視化易操作等特點。
關(guān)鍵詞:FTP客戶端;MFC;WinInet類庫
連接FTP服務(wù)器的方式有很多種,包括命令行、瀏覽器和專門的圖形界面程序,但是這些程序的本質(zhì)都是FTP客戶端。命令行客戶端資源占用小,但命令記憶工作復(fù)雜,只適合熟練的計算機用戶。絕大部分瀏覽器支持FTP客戶端連接。瀏覽器客戶端具有使用方便的特點,但僅具有瀏覽文件和下載的功能,不具備文件上傳和高級文件管理功能。專門的圖形界面客戶端不但界面友好,而且具有比較全面的文件上傳下載功能,有的軟件還有一定的文件管理等高級功能。
現(xiàn)在市面上FTP客戶端種類繁多,軟件規(guī)模有大有小,授權(quán)方式有商業(yè)軟件、開源軟件多種。國內(nèi)FTP客戶端軟件主要以小型軟件為主。現(xiàn)今的FTP客戶端更加注重安全性、提高傳輸速度和提高穩(wěn)定性,提供更加友好的圖形界面。
1FTP客戶端系統(tǒng)功能設(shè)計
一個運行在Windows下的簡易FTP客戶端應(yīng)當包含以下幾個基本的部分:圖形界面,本地文件/遠程文件瀏覽部分,信息反饋部分,文件傳輸部分[1]。
具體的講,該程序的功能設(shè)計如下:
1) 登錄注銷模塊,用于實現(xiàn)客戶端與服務(wù)器的連接建立和連接斷開,這是程序不可缺少的部分;
2) 本地文件瀏覽模塊,用于顯示和列出本地計算機特定目錄下的文件和文件夾,實現(xiàn)文件目錄的顯示、跳轉(zhuǎn),用于選定本機上的特定文件;
3) 遠程文件瀏覽模塊,用于FTP服務(wù)器上的文件瀏覽操作,功能類似于本地文件瀏覽模塊;
4) 信息反饋模塊,用于滾動顯示交互信息;
5) 文件傳輸模塊,用于選定文件的上傳下載,這是程序的重要部分;
6) 圖形界面優(yōu)化設(shè)計和幫助提示部分,包括啟動畫面和幫助系統(tǒng)。
2FTP客戶端在MFC程序開發(fā)中的實現(xiàn)方式
設(shè)計一個基于MFC[2]的FTP客戶端,解決程序核心部分的編程問題有兩種設(shè)計方法:第一種方法,使用Win Socket套接字實現(xiàn)程序的數(shù)據(jù)通信和命令控制,并使用文件輸入輸出流解決文件傳輸問題;第二種方法,使用MFC類庫當中提供的WinInet類庫所包含的類及其封裝函數(shù),來實現(xiàn)FTP客戶端中的常見操作[3]。
這兩種方法相比較,第一種方法比較直接,執(zhí)行效率高,深入底層,但是編程工作難度大,不易操作;第二種方法更易于實現(xiàn),提高了軟件重用率,大大降低了編程難度,避免了使用套接字和文件輸入輸出流等復(fù)雜操作,提高了編程效率。所以,本程序設(shè)計采用第二種方法。
WinInet類庫不僅提供了常見的基于MFC的Internet客戶端的編寫解決方案,如HTTP、FTP等,還提供了連接遠程服務(wù)器操作的相關(guān)類和函數(shù),以及客戶端和服務(wù)器數(shù)據(jù)傳輸?shù)南嚓P(guān)功能,用戶不需要對TCP/IP協(xié)議編程和Win Socket套接字等有深入的了解。除此之外還提供了一整套能夠安全處理網(wǎng)絡(luò)連接、數(shù)據(jù)緩沖傳輸和異常處理的機制。WinInet類庫在文件WININET.DLL中。在實際編程中,需要包含afxinet.h頭文件來引入該類庫[4]。
3FTP客戶端程序的具體實現(xiàn)
3.1圖形界面設(shè)計
本程序使用Visual Studio 2010中的VC++2010實現(xiàn),是一個基于對話框的MFC應(yīng)用程序。圖形界面設(shè)計使用VC++2010的資源視圖打開對話框資源,并使用類似于Visual Basic程序設(shè)計中拖放控件的方法設(shè)計程序的主界面。整體效果如圖1所示。
圖1 FTP客戶端界面效果圖
在控件布局完成后,為了方便編程,需要添加一系列的控件變量,并為其添加相應(yīng)的資源ID號。其中添加的控件變量是程序?qū)υ捒蝾怌MyFTPClientDlg中的成員變量,詳見表1。
表1 控件變量列表
其中控件變量的初始化操作由對話框類CMyFTPClientDlg中的成員函數(shù)DoDataExchange()完成,該函數(shù)由系統(tǒng)生成,函數(shù)內(nèi)部調(diào)用DDX_Control函數(shù)來完成控件變量的初始化。
為了進一步方便編程,統(tǒng)一命名,需要將部分控件添加ID號,詳見表2。
表2 控件資源ID列表
界面的細節(jié)包括了程序圖標、啟動畫面和幫助按鈕的事件響應(yīng)三個部分。
自定義程序圖標是將自制圖標文件命名為<項目名稱>.ico(此處MyFTPClient.ico),覆蓋工程項目文件的res目錄下的對應(yīng)文件即可。該圖標對應(yīng)資源的ID號為系統(tǒng)默認的ID,即IDR_MAINFRAME,表示的是程序窗口圖標和應(yīng)用程序圖標。
由于VC++2008及VC++2010沒有添加啟動畫面的功能,需要手動通過代碼方式添加啟動畫面。啟動畫面的添加過程如下:
1) 創(chuàng)建繼承CWnd類的啟動畫面類CWASplash,重寫其OnPaint()方法和OnCreate()方法,用于在窗體中加載啟動畫面。重寫OnTimer()方法用于關(guān)閉啟動畫面;
2) 添加自定義位圖資源用作啟動畫面;
3) 在對話框類的OnCreate()方法中添加啟動畫面對象,并調(diào)用其重寫的OnCreate()方法創(chuàng)建啟動畫面窗口。刷新顯示該窗口,并暫停代碼執(zhí)行一段時間后銷毀啟動畫面窗口對象資源[5]。啟動畫面顯示完成后繼續(xù)進行主窗口(對話框)的創(chuàng)建。
幫助按鈕功能的實現(xiàn)是通過響應(yīng)“幫助”按鈕的OnBnClick事件,執(zhí)行打開一個文本文件的命令來完成的。使用了ShellExecute()函數(shù),其代碼如下:
void CMyFTPClientDlg::OnBnClickedBtnHelp()
{
ShellExecute(NULL,NULL,_T("Help.txt"),NULL,NULL,SW_SHOWNORMAL);
}
“關(guān)于”按鈕的功能與“幫助”按鈕功能類似,響應(yīng)單擊按鈕事件,打開一個“關(guān)于”對話框,并且以模態(tài)方式打開。其中“關(guān)于”對話框是CaboutDlg類的一個類對象。
其中,信息顯示模塊的功能實現(xiàn)通過自定義函數(shù)ShowMsgLog(CString str)函數(shù)實現(xiàn),用于消息文本框的信息顯示。
3.2客戶端與服務(wù)器的連接
根據(jù)MSDN文檔的介紹,使用WinInet類庫實現(xiàn)FTP客戶端的主要過程有以下兩個步驟[6]:
1) 開始Internet會話,創(chuàng)建CInternetSession對象,初始化WinInet并連接到服務(wù)器;
2) 連接到FTP服務(wù)器,使用CInternetSession::GetFtpConnection,返回CFtpConnection對象。
在實際編程中,在對話框類中創(chuàng)建一個成員變量pConn,類型為CFTPConnection的指針,在構(gòu)造函數(shù)時指空,在連接時指向一個CFTPConnection對象。
連接斷開的處理是:先調(diào)用CFTPConnection的Close()方法,然后pConn指空。若窗口關(guān)閉,對話框類調(diào)用析構(gòu)函數(shù),在析構(gòu)函數(shù)中將pConn指空。連接和斷開處理的代碼是在對應(yīng)按鈕的單擊事件處理函數(shù)OnBnClickedBtnConn()和OnBnClickedDisconn()中完成的[7]。
pConn指針對象的生命周期如圖2所示。
圖2 pConn指針對象的生命周期圖
3.3服務(wù)器文件和本機文件的瀏覽
服務(wù)器文件(或本機文件)的瀏覽操作需要遍歷遠端服務(wù)器(或者是本地)的文件,并在各自的列表框中顯示出來[8]。為了便于服務(wù)器文件目錄(或者是本機的文件目錄)的遍歷操作與當前文件的選定,需要提前設(shè)定兩個全局字符串變量sLocPath和sRmtPath記錄當前路徑。
根據(jù)MSDN文檔,遍歷查找FTP路徑的方法是:
1) 創(chuàng)建一個CFTPFileFind對象;
2) 設(shè)定當前的路徑為根路徑,從根路徑起,先使用CFTPFileFind類中的FindFile()方法找到第一個文件,之后循環(huán)使用FindNextFile()方法遍歷當前目錄,并將找到的文件添加到列表框中,也就是通過GetFileName()方法獲取文件名,直至FindNextFile()方法返回FALSE為止。
顯示遠程文件列表功能由函數(shù)ShowRmtList(void)完成。其中使用IsDirectory()方法判斷是不是文件夾。文件夾的表示應(yīng)當區(qū)別于普通文件,本程序規(guī)定,文件夾使用“[文件名]”的方式,依據(jù)計算機上使用習慣,“[..]”表示上一級文件夾。
遠程文件目錄瀏覽跳轉(zhuǎn)需要響應(yīng)對列表框的雙擊事件,由函數(shù)OnLbnDblclkRmtflst()中的代碼實現(xiàn)。對雙擊列表框?qū)ο筮M行響應(yīng)時,需判斷雙擊的是文件夾還是上層目錄。若是文件夾,則對當前目錄字符串追加當前雙擊選中的字符串;若是上級目錄,則當前目錄字符串回退查找至上一個“/”字符,并截斷至此;若是普通文件,則不做操作。最后重新顯示當前目錄。
目錄列表還需要響應(yīng)選中事件,由消息處理函數(shù)OnLbnSelchangeRmtflst()完成,并獲取當前選中遠程文件的路徑,并存儲在全局字符串selectedRmtPath中。
本地文件瀏覽的原理與遠程文件瀏覽的原理類似,遍歷本機文件使用CfileFind對象中的相關(guān)方法,其函數(shù)的使用方式與遠程文件瀏覽相關(guān)方法類似。但是需要特別注意Windows操作系統(tǒng)的文件系統(tǒng)表示方式和遠程服務(wù)器上使用類UNIX的文件目錄表示方式有很大不同。其中類UNIX操作系統(tǒng)文件系統(tǒng)根目錄用“/”表示,然而Windows操作系統(tǒng)的文件路徑的開頭是“盤符:”的形式。本地文件目錄的完成還需要選擇驅(qū)動器盤符,需要調(diào)用GetLogicalDrives()這個Win32平臺SDK函數(shù)(它不是MFC中封裝的函數(shù))。這個函數(shù)返回一個用二進制掩碼表示的雙字類型的值,用來表示驅(qū)動器盤符。獲取驅(qū)動器盤符后經(jīng)過轉(zhuǎn)換轉(zhuǎn)換成字符類型,逐個添加到下拉列表中。
同理,顯示本機文件的相關(guān)函數(shù)有:顯示本機列表函數(shù)ShowLocFiles(void),雙擊事件響應(yīng)函數(shù)OnLbnDblclkLocflst(),列表項選中處理事件OnLbnSelchangeLocflst()(這個函數(shù)獲取當前選中本地文件的路徑,并存儲在selectedLocPath全局字符串中)。
3.4文件傳輸
文件傳輸模塊是本程序的重要組成部分,連接模塊和文件瀏覽模塊是文件傳輸模塊的技術(shù)基礎(chǔ)和技術(shù)準備。文件傳輸部分包括上傳和下載,分別由上傳按鈕的單擊事件處理函數(shù)OnBnClickedBtnUpld()和下載按鈕的單擊事件處理函數(shù)OnBnClickedBtnDnld()完成。上傳函數(shù)PutFile()和下載函數(shù)GetFile()是CFTPConnection類的成員函數(shù)。在實際編程時,只需調(diào)用它們的重載函數(shù),只填寫前兩個參數(shù),即源文件和目標文件即可,其余參數(shù)均有默認值。
4結(jié)束語
本文設(shè)計了基于MFC的FTP客戶端程序結(jié)構(gòu),闡述了使用MFC的WinInet類庫開發(fā)Internet客戶端的過程,并使用Visual C++ 2010編寫了程序。但是本程序僅實現(xiàn)了FTP客戶端的基本功能,對于程序的不足之處還需要在進一步的工作中加以改進。
參考文獻
[1]吳珂.基于FTP協(xié)議客戶端軟件的實現(xiàn)[J].沈陽航空工業(yè)學院報,2008(4):39-42.
[2]MFC[EB/OL].http://baike.baidu.com/subview/10918/5039469.htm,2006.
[3]劉萍.FTP客戶端軟件的實現(xiàn)[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客戶端應(yīng)用程序中的步驟[EB/OL].https://msdn.microsoft.com/zh-cn/library/hf9x9wb4.aspx,2009.
[7]謝鵬.FTP客戶端程序的設(shè)計與應(yīng)用[J].科技經(jīng)濟市場,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- ),女,山西高平人,講師,碩士,研究方向:數(shù)據(jù)庫與軟件工程。
文章編號: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