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