摘要: 介紹了使用Windows系統(tǒng)級DLL對FTP調(diào)用的功能,采用C#編程實(shí)現(xiàn)了一個(gè)專用的FTP工具,用于完成業(yè)務(wù)系統(tǒng)的上傳、更新、同步等功能,并具有提供業(yè)務(wù)中FTP對比的特色功能。
關(guān)鍵詞: FTP; 更新; 同步; 比對
中圖分類號:TP311.1 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2012)10-07-05
引言
在業(yè)務(wù)系統(tǒng)中,F(xiàn)TP對于軟件的發(fā)布、內(nèi)部工具的更新等起著極為重要的作用。本文介紹如何使用C#編程實(shí)現(xiàn)一個(gè)專用的FTP工具,用于完成業(yè)務(wù)系統(tǒng)的上傳、更新、同步等功能,并具有提供業(yè)務(wù)中FTP對比的特色功能。
1 實(shí)現(xiàn)目標(biāo)與思路
1.1 實(shí)現(xiàn)目標(biāo)
常用的FTP工具大多基于交互界面,為了工具使用的方便性,采用命令行的方式來實(shí)現(xiàn)對應(yīng)的功能更有價(jià)值。因此,我們要達(dá)成以下目的:
⑴ 用命令行完成一個(gè)目錄的上傳下載(非常適用于更新,能夠雙擊或者是一個(gè)快捷鍵就能完成FTP的同步);
⑵ FTP是否傳輸正確,通過命令行完成比對(提供快速比對和完全比對),它實(shí)際上等于全部下載后(在內(nèi)存)比較;也可進(jìn)行快速比對,每個(gè)文件首先判斷大小是否相同,如果大小相同,則只取指定長度的內(nèi)容作比較,起初步判斷作用。
因此,對工具的使用我們定義成以下的格式:
⑴ Myftp -up d:\\sj FTP目錄:完成 d:\\sj上傳到FTP目錄;
⑵ Myftp -down FTP目錄d:\\sj:完成從FTP目錄下傳到d:\\sj目錄;
⑶ Myftp -c d:\\sj FTP目錄:確認(rèn)本地目錄d:\\sj是否都已經(jīng)正確上傳至FTP;
⑷ Myftp -c -q5120 d:\\sj FTP目錄:功能與⑶相同,但是-q的選項(xiàng)用于快速比較,-q后面表示比較的字節(jié)數(shù),如果文件長度相同,則讀取相應(yīng)的字節(jié)數(shù)與本地文件進(jìn)行比較,判斷其是否相同,從而完成一定程度上的快速比較。
1.2 實(shí)現(xiàn)的基本思路
為了使工具具有方便性,因此要實(shí)現(xiàn):
⑴ 根據(jù)傳入的命令行參數(shù)解析對應(yīng)功能;
⑵ 針對不同目標(biāo),完成對應(yīng)功能處理。
1.3 實(shí)現(xiàn)難點(diǎn)
為了實(shí)現(xiàn)相應(yīng)的功能,仔細(xì)分析了FTP的特點(diǎn),我們所面臨的幾個(gè)基本問題是:
⑴ FTP文件的上下傳輸處理
在上下傳輸處理中,使用系統(tǒng)的API方式處理FTP的方法,需要集中的一個(gè)namespace中來處理。
⑵ FTP目錄單進(jìn)程非遞歸遍歷的實(shí)現(xiàn)方法
與FTP交互是一個(gè)單線程的過程,但是FTP目錄和本地文件目錄結(jié)果類似,它是一個(gè)樹型結(jié)構(gòu),要處理它的單線程又無法使用遞歸實(shí)現(xiàn)就成了問題。在程序中我們使用了數(shù)組來實(shí)現(xiàn)它的遞歸效果;并且在每次處理時(shí),實(shí)現(xiàn)只處理目錄的當(dāng)前層,勿需同時(shí)在多個(gè)目錄間來回折騰。
⑶ 虛擬動(dòng)態(tài)數(shù)組
由于使用的目錄和文件數(shù)的總個(gè)數(shù)并不確定,因此在程序中我們要實(shí)現(xiàn)數(shù)組的動(dòng)態(tài)擴(kuò)展功能,其實(shí)這只要使用C#中的list類型就可以實(shí)現(xiàn),這樣,容器最終可以保留下來所有的子目錄和文件列表。
2 具體實(shí)現(xiàn)
根據(jù)功能劃分,我們的主流程是命令行解析和對應(yīng)功能的處理。下面我們按命令行解析和具體每一項(xiàng)功能的處理來進(jìn)行具體分析和說明,針對主程序和各功能的實(shí)現(xiàn)進(jìn)行描述。
2.1 命令行的解析處理
在C#的主程序處理中和C非常類似,對于傳入的參數(shù)在main主程序中(program.cs):
我們針對命令行中不同的參數(shù)進(jìn)行分支處理,轉(zhuǎn)向了具體的功能實(shí)現(xiàn),分別有上傳、下載、對比,在對比功能中有輔助參數(shù),就是對比時(shí)選擇長度的功能處理。通過分支處理后,程序就顯得條理清晰。
接下來描述如何實(shí)現(xiàn)FTP的上傳、下載與對比功能。
2.2 FTP處理
對于FTP的子功能處理,我們在namespace MyProFTP中,封裝了調(diào)用系統(tǒng)wininet.dll時(shí)所使用到的以下數(shù)據(jù):
⑴ 結(jié)構(gòu)數(shù)據(jù):FILETIME、WIN32_FIND_DATA、Itemftp;
⑵ 相關(guān)函數(shù)調(diào)用的類FtpDll。
對于具體的FTP處理使用以下的處理流程:
⑴ 首先連接FTP;
⑵ 取得FTP上的文件目錄清單;
⑶ 下載時(shí)將FTP上的文件同步到本地目錄;
⑷ 如果是文件比對,則和下載相似,只要將FTP上文件內(nèi)容讀取到內(nèi)容和本地文件內(nèi)容進(jìn)行比較(二進(jìn)制流的比較);
⑸ 如果是快速比較,則從FTP上讀取的信息只要是用戶指定的長度即可。
有關(guān)FTP具體功能的處理,定義了namespae myftp,里面有FTP上下傳與對比的處理方法。
2.2.1 從FTP下載
功能使用方法說明:
在整個(gè)下載過程中:
⑴ 通過MyFtp.fun_Connect連接指定的FTP信息:在fun_Connect中完成對FTP命令行參數(shù)中指定的FTP進(jìn)行連接,通過InternetOpen來初始化連接,并使用InternetConnect來完成使用指定用戶進(jìn)行建立鏈接。
⑵ MyFtp.fun_FtpDirs完成了對ftp目錄及子目錄的遍歷:實(shí)際上在類ftpdll的私有函數(shù)private int fun_FtpDirs(string as_dir, Boolean ab_Build)中,把當(dāng)前目錄下的目錄名與文件名加入到列表中。因此使用類型List
針對要取得的所有文件,依次下載在FTP上的所有文件,使用MyFtp.fun_downfile來完成:此功能只是對指定文件進(jìn)行下載。
由于工具通過系統(tǒng)級的wininet.dll來對FTP進(jìn)行處理,因此功能上還具有非常強(qiáng)的兼容性的。為保證文件的正確性,文件傳輸時(shí)使用BINARY即流格式。
2.2.2 上傳至FTP
功能使用方法說明:
主要是兩個(gè)主流程:
⑴ 取得本地的所有文件與文件夾的清單,通過函數(shù)fun_locfiles來完成:
//搜索當(dāng)前目錄所有文件
我們也使用了循環(huán)方式來完成遞歸對樹型結(jié)構(gòu)的目錄及文件信息的獲取。
⑵ 每次只要處理單個(gè)文件的上傳:
如果是目錄,則判斷FTP上目錄是否存在,如果不存在,則只需建立相應(yīng)的目錄即可。
由此可見,對于單文件上傳非常簡單,只要使用dll中對應(yīng)的函數(shù)就可以完成。
對于文件的上傳和下載,我們在功能上都已經(jīng)完成了,相比之下,實(shí)現(xiàn)比對功能并不是復(fù)雜的問題,但其過程會(huì)復(fù)雜一些。
2.2.3 文件比對
文件比對其實(shí)整合了文件下載和本地文件讀取的功能,它要比較相應(yīng)的文件在FTP是否正確上傳,所以需檢測FTP上的文件是否和本地相同,而對本地刪除的文件并不作處理。命令的用法如下:
實(shí)際使用效果如圖3所示。
圖3 文件比對實(shí)際使用效果圖
在實(shí)現(xiàn)時(shí),連接FTP后取FTP上對應(yīng)的目錄,循環(huán)也以本地為主。本地與FTP可能存在差異,我們?nèi)TP對應(yīng)目錄下的文件與目錄信息。
⑴ 文件或目錄在FTP上不存在,可以利用ftpdll.fun_findftp函數(shù)在ftpfiles中直接找出。
⑵ 如果發(fā)現(xiàn)目錄不存在,則自動(dòng)從locfiles中剔除了同一目錄及子目錄下的所有文件及目錄(不需要再作比較),只需要告知目錄不存在即可。
⑶ 當(dāng)文件存在時(shí),打開FTP文件句柄取得長度后與本地文件進(jìn)行比較,若發(fā)現(xiàn)長度不同,則確定文件是不同的。
⑷ 如果長度相同,此時(shí)就可以根據(jù)傳入?yún)?shù)來決定是整個(gè)文件與本地文件進(jìn)行比較還是讀取限定長度來進(jìn)行比較。
在函數(shù)fun_FtpCompare中完成本地目錄和ftp目錄之間的文件比較,判別是否正確上傳,編碼如下:
結(jié)合文件下載和上傳,使用MyFtp.fun_FtpDirs取得了FTP上的文件列表,然后依次比較文件夾和文件是否存在,及相應(yīng)的文件是否相同。
考慮到有的文件過大,因此為檢測提供了抽樣比較的方法,就是可以讀取一個(gè)大文件的指定長度來進(jìn)行快速檢測。它的命令行是:
該命令行表示對文件最多只抽取128000字節(jié)進(jìn)行檢測,這樣,當(dāng)大文件很多時(shí),就不需要從ftp上讀取文件的全部內(nèi)容來進(jìn)行比較,可以選擇快速比較,雖然快速比較的結(jié)果不一定完全正確,但是有時(shí)可以進(jìn)行臨時(shí)性地快速比較,還是很有價(jià)值的。
在文件比較函數(shù)fun_Compare中,以下我們提供了全文件的比較和抽取部分長度的比較方法(//2010-01-25比對相應(yīng)的文件時(shí)用到的四個(gè)參數(shù)是:本地文件,是否目錄,本地路徑,提示內(nèi)容)。
在文件比對時(shí),若長度不同或者是文件不存在,可以即時(shí)返回,而長度相同時(shí)就需要讀取內(nèi)容進(jìn)行比較;當(dāng)有限定長度時(shí),只比對指定長度(大于文件長度時(shí),只取文件長度)。
3 結(jié)束語
本文介紹了使用Windows系統(tǒng)級DLL對FTP調(diào)用的功能,它不僅可以完成用戶對FTP的更新和下載功能,而且還可以進(jìn)行FTP的比對和快速比對,使FTP的維護(hù)變得更為簡單易用。這樣的工具使實(shí)際業(yè)務(wù)操作變得更方便。
當(dāng)然,如果想在此基礎(chǔ)上擴(kuò)展其他功能仍是可行的,但就目前所提供的功能在實(shí)際使用中已是極大地方便了維護(hù)工作,具有較大的推廣價(jià)值。
參考文獻(xiàn):
[1] 冀志剛,王祥.用JAVA語言實(shí)現(xiàn)FTP客戶端[J].唐山師范學(xué)院學(xué)報(bào),2006.28(5):81-82
[2] 李斌.FTP文件搜索引擎的實(shí)現(xiàn)(二)[J].電腦編程技巧與維護(hù),2012.9:63
[3] 蔡永.FTP服務(wù)器技術(shù)研究及實(shí)現(xiàn)[D].電子科技大學(xué)碩士學(xué)位論文,2005.
[4] (美)派克(Pike,M.A.),(美)埃斯塔布魯克(Estabrook,N.)著, 肖紹良,馮雷譯.Internet FTP用戶使用指南[M].科學(xué)出版社,1996年.
[5] 數(shù)位文化編著.FTP總司令[M].北京大學(xué)出版社,2000.