使用Windows服務實現(xiàn)文件夾同步的技術研究_第1頁
使用Windows服務實現(xiàn)文件夾同步的技術研究_第2頁
使用Windows服務實現(xiàn)文件夾同步的技術研究_第3頁
使用Windows服務實現(xiàn)文件夾同步的技術研究_第4頁
使用Windows服務實現(xiàn)文件夾同步的技術研究_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、使用windows服務實現(xiàn)文件夾同步的技術研究1 弓 i 言(introduction)在很多場合,用戶需要在兩個文件夾之間維持同步的工作(比如更 新web文件),或基于安全的原因備份某個文件夾中的內(nèi)容到其他文件 夾等。一般的做法是使用windows資源管理器手工實現(xiàn)文件夾的同步, 但是人們時常忘記這一工作。要實現(xiàn)兩個文件夾同步,必須要有一個監(jiān)控工具時刻監(jiān)測這兩個文 件夾,并比較它們的不同之處。當兩個文件夾其中一個發(fā)生變化,比如 對某個文件進行修改后,同步工具能完成實時同步。事實上這種工具目 前的需求量很大,很多文件夾需要與多個目標位置保持同步,如果通過 手工實現(xiàn)同步,其弊端主要包括工作量大,

2、容易出錯等。本文主要研究的是一個功能強大的文件夾同步服務程序,用戶可以 指定耍同步的一個或多個文件夾,指定同步的時間,程序在一個 windows服務后臺進行檢測,將文件夾從一個源位置同步到目標位置。2 文件夾同步功能概述(summary of folder synchronization)文件夾同步功能的技術提供了一個同步服務配置工具,這是一個 windows forms項目,實現(xiàn)對服務的配置,配置結(jié)果保存為xml文件 格式。同時為了調(diào)試windows服務,程序?qū)崿F(xiàn)了一個服務控制臺工具。調(diào)試一個windows服務非常麻煩,這個控制臺程序使程序員可以調(diào)試 包含在windows服務中的核心代碼的實

3、現(xiàn),不用去頻繁地安裝卸載服 務。這個控制臺程序還可以與文件服務配置程序進行通信。使用wcf 命令管道在兩個進程z間進行通信1。該系統(tǒng)組成結(jié)構(gòu)如圖1所示。圖丨丈件同步工具的系扯俎成結(jié)構(gòu)fig.l system aiuirositioii structure of file syirliragtion tool3 文件夾同步主要功能(main function of folder synchronization) 文件夾同步的主要功能通過一個類庫項目synchrolib實現(xiàn),便于 多次重用。該項目中的對象包括同步項集合對象、后臺同步線程等。3.1實現(xiàn)文件夾同步項集合對象syncitemcollec

4、tion集合實際上是一個泛型的listsyncltem對 象。但是syncitemcollection需要具有從xml元素中獲取同步對象的 能力,以及允許用戶開始所有同步對象的更新工作,因此從 listvsyncitem派生,也可以實現(xiàn)一個雷,在內(nèi)部包含一個泛型的 listsyncltem 集合來處理多個同步對象2。syncitemcollection對象有一個xeiement類型的屬性,該屬性將 根據(jù)在構(gòu)造函數(shù)中傳入xml元素來解析出多個syncitem對象并加載到 list集合中。該屬性的定義代碼如下:使用xeiement獲取或者是設置syncitem集合public xeiement x

5、eiementget 實例化一個新的xeiement對象xeiement value=new xeiement(“syncltemsj; foreach(syncltem item in this)/將同步對象屮的xml元素添加到xeiement元素集合value.add(item xeiement);return value; 返回 xeiement 對象實例setif(value!=null) 遍歷xeiement的子元素foreach(xeiement element in value.elements()/根據(jù)xml元素得到syncitem對象實例,添加到集合this.add(new

6、syncltem(element);get設置區(qū)域中,通過實例化一個元素名稱為syncitems來構(gòu)造一個xml片段。然后遍歷集合屮syncitem對象,將syncitem的xeiement 屬性返冋的xml片段加入到該xeiement的了元素集合中。在set設置 器中,通過遍歷xeiement的子元素集合來實例化新的syncitem對象, 再添加到泛型集合中構(gòu)造了同步集合。3.2實現(xiàn)后臺同步線程syncfiles實現(xiàn)了同步文件的操作,該方法將根據(jù)是否能進行同步 工作來實現(xiàn)同步,實現(xiàn)代碼如下:同步文件夾的線程委托,更新目標文件夾屮的文件,且在完成時 觸發(fā)事件private void syncf

7、iles()if(this.canstartsync) /如果允許文件夾同步trydatetime before=datetime.now; /得到同步前的時間將源文件夾中的文件更新到目標文件夾中this.tofileslistupdate(thissyn cfrompath,this.s yn csubfolders);datetime after=datetime.now; 更新后的時間timespan elapsed=after-before; 得到所花費的時間int updates=this.tofileslist.updates; 得到更新的個數(shù)filelnfoevent(this,

8、new filelnfoargs(updates,elapsed); /觸發(fā)更新完成事件catch(threadabortexception ex) /如果更新觸發(fā)異常 if(ex!=null) /異常處理代碼catch(exception)throw; 重新拋出這個方法最核心的部分在于使用tofileslist的update將源文件夾 中的文件更新到目標文件夾,更新前和更新后都記錄了當前時間,以便 記錄下更新所花費的時間,并且記得更新的文件個數(shù)。在更新完成后, 將調(diào)用filelnfoevent事件處理代碼3。4 文件夾同步關鍵技術(key technology of folder synch

9、ronization)4.1使用wcf開發(fā)命名管道程序進程間通信(ipc)的應用非常廣泛,其特點是消息無須跨越防火墻 和主機。ipc是一種通信的方法,源于unix操作系統(tǒng)。在windows 操作系統(tǒng)中,使用進程間通信除了命名管道,還可以使用剪貼板、郵件 槽、tcp/ip通信、內(nèi)存映射文件等技術4。wcf本身提供了 netnamedpipebing對象,使創(chuàng)建命名管道變得 非常簡單。wcf把通信都進行了統(tǒng)一化,假如熟悉wcf開發(fā),完全 不用去學習與命名管道相關的細節(jié),由wcf實現(xiàn)管道的創(chuàng)建與通信工 作。使用netnamedpipebinding綁楚與其他類型綁是的不同之處在于 路徑的指定,例如使

10、用地址:net.pipe:/localhost/synchroservicewcf0 地址中的net.pipe對應命名管道協(xié)議,任何使用了命名管道傳輸通道的 綁定都使用net.pipe作為地址的協(xié)議部分。localhost是地址的主機部 分,而synchroservicewcf是一個可選項,是為了使系統(tǒng)可讀,通常 是服務名稱,命名應該與服務內(nèi)容相關,讓人更清楚服務的作用5。4.2實現(xiàn)監(jiān)控和配置項目配置和監(jiān)控windows forms項目提供了用戶界面與用戶交互。該 項冃提供了如下功能讓用戶配置文件同步服務,以及查看由windows 服務返回的文件同步結(jié)果消息。(1) 允許添加和修改同步項,以及

11、用于文件同步所需要的一些設置選項,這些選項將被保存到xml配置文件中。(2) 允許啟動和停止windows服務,以及作為wcf服務宿主來監(jiān) 聽來自windows服務的同步結(jié)果消息。(3) 允許安裝和卸載windows服務,并能檢查windows服務是否 安裝。實現(xiàn)這個項h使文件同步程序能夠提高使用性,也便于查看在文件同步過程中到底是成功還是失敗,能深入了解文件同步的過程6。4.2.1在主窗口中啟動或停止服務用戶主界面的啟動、停止服務都將調(diào)用globals靜態(tài)類中定義的相 關的方法來啟動和停止服務。當服務啟動后,如果windows服務實現(xiàn) 了同步的操作,將使用命名管道發(fā)送同步消息,wcf服務受到

12、消息, 觸發(fā)form1_synchrohostevent事件處理代碼,代碼如下:void form 1 _synchrohostevent(objectsender,synchrohosteventargs e)e.date=e.date.clearseconds(); 使用擴展方法清除日期中的秒 數(shù)string dateformat=lyyyy-mm-dd hhmrrt;/定義顯示的日期格式if(this.listboxactivity.items.count>0) /移除任何大于 24 小時的記 錄bool deleted=false;do循環(huán)移除日期的最后一條deleted=fal

13、se;獲取listbox中最后一個item的索引號int lastltem=thisistboxactivityterns.count1;得到最后一個listviewltem的文本string oldestmsg=thisistboxactivitytemslastltem.tostring();如果字符串不為空或null且字符串的長度大于16個if(!string.lsnullorempty(oldestmsg)&&oldestmsg .length>16)0-desimsgh0-desimsgsubsmng(p16)fehlkwj16->兇三 daotime d

14、aqiime if(da(dtime.tryparse(o-desimsgoui daohme)亠timespan e-apsedhda(diimeedacd©rt 巨m ifgapsed.daysvo) w 笛淞>hhhip>知適巨習 亠ihis-isiboxa2.i<.iy-0msremoveai(-asi-qm=d e - eiedhir u e 二/蹦冷口臺粥 e-se-二審淫h啟敲郵越可0闘蘋舟 ihis-isiboxacimiy-omsremove>(-ash0md e-e(dd"r u 22陽2塗w一)whi-e(de-ecdd)八 /

15、眶 de_eied 窮苗涉 fa-se 迢is圧喩孕 一帚匚s5ox耳舸歿毬>潼耳>4講血如siring msgusmng.forma 三(0)丄二 jedaqtos=ing(da(dformau-emessage) ihis-isaoxacimiy-0ms-nserl(pmsg=在代碼中,首先使用擴展方法clearseconds清除日期時間中的秒 數(shù),再判斷l(xiāng)istbox中是否存在記錄。如果存在,則在一個循環(huán)do中 進行刪除操作。在循環(huán)體中,總檢查listbox中的最后一行,得到最后 一行顯示的文本,先獲取表示日期時間的前16個字符串,使用 datetime.tryparse將其

16、轉(zhuǎn)換為fl期格式。然后判斷該時間與從服務器 端當前返冋的時間是否相差多過一天,如果大于0,表示超過24小時, 則進行項的移除;當delete標志為false時,表示沒有大于1天的口志, 則退出循環(huán)。最后將從wcf服務屮傳回的小時插入到listbox中的頂 部,即第0行7。4.2.2使用同步項更新用戶界面formaddsyncitem類重載了默認的構(gòu)造函數(shù),用來接收一個 list<string>集合和一個要編輯的syncitem。一旦syncitem被傳入,會 使用同步對象屮的屬性來更新用戶界面。formaddsyncitem類的構(gòu)造 函數(shù)代碼如下:public formaddsyn

17、cltem(syncltem item,list<string> names)m_existingnames=names; 得到同步項名稱集合m_adding=(item=null); 判斷是否為添加還是編輯狀態(tài) this.syncltem=item; 賦同步項對象實例initializecompone nt();如果是添加一個新的項,需要提供一個唯一的名稱以免用戶輸入 重復的同步項名稱if(m_adding) /如果為添加string tempname=4t文件同步項0”;int count=0; 初始化計數(shù)器do 通過循環(huán)得到新的名稱增量this.textboxname.tex

18、t=string.format(tempname,4-+count);while(namelsduplicate(); 判斷名稱是否重復else使用指定的同步項更新用戶界面this.textboxname.text=item.name; 同步項名稱this.textboxsyncfrom.text=item.syncfrompath; 源路徑 this.textboxsyncto.text=item.synctopath; 目標路徑 this.textboxbackupfolder.text=item.backuppath; 備份路徑 this.checkboxbackupbeforesync

19、.checked=item.backupbeforesync; 是否備份this.checkboxenable.checked=item.enabled; 是否允許 this.checkboxincludesubs.checked=item.syncsubfolders; 是否包含子文件夾this.checkboxremoveaftersync.checked=ite m. deleteaftersync;同步后是否刪除之所以傳入同步項名稱集合,是因為程序要避免出現(xiàn)具有相同名稱 的同步項。如果是新增狀態(tài),程序通過循環(huán)的方式自動提供了一個同步 項名稱。如果不為新增狀態(tài),程序?qū)膫魅氲膕yncit

20、em中更新用戶界 面,以便用戶可以編輯現(xiàn)有的同步項8。5 結(jié)論(conclusion)使用system.10命名空間中的文件操作類能實現(xiàn)在兩個或多個文 件夾z前自動復制備份,實現(xiàn)同步工作,并使用oop方法設計文件同 步相關的類,將文件同步的核心功能實現(xiàn)在windows服務中,為了在 windows服務與監(jiān)控配置程序之間通信,使用wcf命名管道實現(xiàn)了進 程間的通信。服務類應用程序的開發(fā)在實現(xiàn)文件夾同步技術屮發(fā)揮了很大的優(yōu) 勢,同時能更深入地理解windows服務的使用,其相關技術有待進一 步研究。參考文獻(references)1 qingfeng jing,et al.pseudo-noise preamble based joint frame and frequency synchronization algorithm in ofdm communication systemsj.journal of systems engineering andelectronics,2014,(01 ):251 -25

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論