![移動(dòng)存儲(chǔ)同步程序_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-6/9/2104ea68-843a-459c-9f74-712a14d6545e/2104ea68-843a-459c-9f74-712a14d6545e1.gif)
![移動(dòng)存儲(chǔ)同步程序_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-6/9/2104ea68-843a-459c-9f74-712a14d6545e/2104ea68-843a-459c-9f74-712a14d6545e2.gif)
![移動(dòng)存儲(chǔ)同步程序_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-6/9/2104ea68-843a-459c-9f74-712a14d6545e/2104ea68-843a-459c-9f74-712a14d6545e3.gif)
![移動(dòng)存儲(chǔ)同步程序_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-6/9/2104ea68-843a-459c-9f74-712a14d6545e/2104ea68-843a-459c-9f74-712a14d6545e4.gif)
![移動(dòng)存儲(chǔ)同步程序_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-6/9/2104ea68-843a-459c-9f74-712a14d6545e/2104ea68-843a-459c-9f74-712a14d6545e5.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、XXX大學(xué) 課 程 設(shè) 計(jì) 報(bào) 告移動(dòng)存儲(chǔ)同步程序課程名稱(chēng):計(jì)算機(jī)系統(tǒng)開(kāi)發(fā)綜合訓(xùn)練院 (系): 信息科學(xué)與技術(shù)學(xué)院 專(zhuān)業(yè)班級(jí): 計(jì)算機(jī)123班 學(xué) 號(hào): XXX 姓 名: XXX 指導(dǎo)老師: XXX 源代碼下載:承諾書(shū)鄭重聲明:本人所呈交的課程設(shè)計(jì)是本人在導(dǎo)師指導(dǎo)下獨(dú)立撰寫(xiě)并完成的,課程設(shè)計(jì)沒(méi)有剽竊、抄襲、造假等違反學(xué)術(shù)道德、學(xué)術(shù)規(guī)范和侵權(quán)行為。本課程設(shè)計(jì)不包含任何其他個(gè)人或集體已經(jīng)發(fā)表或撰寫(xiě)過(guò)的研究成果,如果引用則標(biāo)識(shí)出了出處。對(duì)本課程設(shè)計(jì)的研究做出貢獻(xiàn)的個(gè)人和集體,均已在文中以明確方式標(biāo)明。課程設(shè)計(jì)與資料若有不實(shí)之處,本人承擔(dān)一切相關(guān)責(zé)任。特此聲明。 簽名: 年月 日目 錄一、需求分析11
2、.1 存儲(chǔ)同步概念11.2 存儲(chǔ)同步分類(lèi)11.3 移動(dòng)存儲(chǔ)同步的意義1二、系統(tǒng)設(shè)計(jì)22.1 系統(tǒng)功能22.1.1設(shè)置同步映射22.1.2等待插入移動(dòng)存儲(chǔ)設(shè)備22.1.3掃描主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備32.1.4判定與更新32.2 系統(tǒng)平臺(tái)32.3 系統(tǒng)框架32.4 系統(tǒng)開(kāi)發(fā)語(yǔ)言32.5 系統(tǒng)界面設(shè)計(jì)32.6 系統(tǒng)模塊劃分52.6.1 添加同步映射52.6.2 存取同步映射62.6.3 監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備62.6.4 獲取存儲(chǔ)設(shè)備信息62.6.5 映射轉(zhuǎn)換72.6.6 獲取文件列表72.6.7 文件更新與替換72.6.8 消息輸出72.6.9 響應(yīng)用戶(hù)操作82.7 主要技術(shù)8三、編程實(shí)現(xiàn)83.1添加同
3、步映射83.2存取同步映射93.3監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備113.4獲取存儲(chǔ)設(shè)備信息133.5映射轉(zhuǎn)換143.6獲取文件列表153.7文件替換與更新163.7.1文件替換163.7.2 文件更新183.8消息輸出193.9響應(yīng)用戶(hù)操作20四、程序測(cè)試204.1 測(cè)試環(huán)境204.2 測(cè)試設(shè)備214.3 測(cè)試步驟214.4 測(cè)試結(jié)果22五、課程設(shè)計(jì)總結(jié)23參 考 文 獻(xiàn)25一、 需求分析1.1 存儲(chǔ)同步概念實(shí)現(xiàn)一份數(shù)據(jù)在多個(gè)存儲(chǔ)器中保持?jǐn)?shù)據(jù)一致稱(chēng)為存儲(chǔ)同步。當(dāng)一份數(shù)據(jù)在多個(gè)存儲(chǔ)設(shè)備上存在復(fù)本時(shí),保證數(shù)據(jù)在所有存儲(chǔ)設(shè)備上的一致性顯得越來(lái)越重要。若數(shù)據(jù)在不同的存儲(chǔ)設(shè)備上的數(shù)據(jù)不一致,即數(shù)據(jù)不同步,則會(huì)出現(xiàn)“
4、臟數(shù)據(jù)”,等意想不到的后果。因此,實(shí)現(xiàn)數(shù)據(jù)的同步在如今大數(shù)據(jù)時(shí)代顯得尤為重要。通過(guò)使用相應(yīng)的數(shù)據(jù)同步軟件,指定需要同步的數(shù)據(jù), 可以實(shí)現(xiàn)數(shù)據(jù)的同步。1.2 存儲(chǔ)同步分類(lèi)根據(jù)存儲(chǔ)設(shè)備分類(lèi),可分為云存儲(chǔ)同步和移動(dòng)存儲(chǔ)同步。云存儲(chǔ)是在云計(jì)算概念上延伸和發(fā)展出來(lái)的一個(gè)新的概念,是指通過(guò)集群應(yīng)用、網(wǎng)格技術(shù)或分布式文件系統(tǒng)等功能,將網(wǎng)絡(luò)中大量各種不同類(lèi)型的存儲(chǔ)設(shè)備通過(guò)應(yīng)用軟件集合起來(lái)協(xié)同工作,共同對(duì)外提供數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)訪問(wèn)功能的一個(gè)系統(tǒng)。云存儲(chǔ)同步即實(shí)現(xiàn)終端設(shè)備數(shù)據(jù)與云服務(wù)器上存儲(chǔ)的數(shù)據(jù)之間的同步。移動(dòng)存儲(chǔ)同步,即同步的數(shù)據(jù)主要分布在主機(jī) 可移動(dòng)存儲(chǔ)設(shè)備,或可移動(dòng)存儲(chǔ)設(shè)備 可移動(dòng)存儲(chǔ)設(shè)備之間。在主機(jī) 可移
5、動(dòng)存儲(chǔ)設(shè)備同步模式中,當(dāng)主機(jī)檢測(cè)到有可移動(dòng)存儲(chǔ)設(shè)備插入時(shí),應(yīng)對(duì)本機(jī)數(shù)據(jù)和移動(dòng)存儲(chǔ)設(shè)備中的數(shù)據(jù)進(jìn)行掃描,確定是否有文件需要同步。在可移動(dòng)存儲(chǔ)設(shè)備 可移動(dòng)存儲(chǔ)設(shè)備同步模式中,當(dāng)兩個(gè)或多個(gè)移動(dòng)存儲(chǔ)設(shè)備插入到同一臺(tái)主機(jī)時(shí),主機(jī)對(duì)所有插入的可移動(dòng)磁盤(pán)進(jìn)行掃描,確定是否有需要同步的文件。1.3 移動(dòng)存儲(chǔ)同步的意義移動(dòng)存儲(chǔ)是目前使用較廣也較方便的方式。該方式的主要特點(diǎn)是便捷與價(jià)格低廉。目前主要的移動(dòng)存儲(chǔ)設(shè)備有閃存設(shè)備,即U盤(pán)和移動(dòng)硬盤(pán)等。在主機(jī) 可移動(dòng)存儲(chǔ)設(shè)備同步模式下,通常是在主機(jī)中編輯好數(shù)據(jù),再通過(guò)可移動(dòng)存儲(chǔ)設(shè)備把該數(shù)據(jù)帶到另一臺(tái)主機(jī)中使用。在另一臺(tái)主同中使用的過(guò)程中,可能會(huì)修改數(shù)據(jù),這時(shí),可移動(dòng)存儲(chǔ)設(shè)
6、備中的數(shù)據(jù)為最后編輯的數(shù)據(jù),源主機(jī)中的數(shù)據(jù)為臟數(shù)據(jù)。此時(shí)的同步應(yīng)使用可移動(dòng)存儲(chǔ)設(shè)備中的數(shù)據(jù)替換源主機(jī)中的數(shù)據(jù),以達(dá)到數(shù)據(jù)同步的目的。另一種情況是,在源主機(jī)中繼續(xù)對(duì)數(shù)據(jù)進(jìn)行編輯,此時(shí)源主機(jī)中的數(shù)據(jù)為最后編輯的數(shù)據(jù),而可移動(dòng)存儲(chǔ)設(shè)備中的數(shù)據(jù)為臟數(shù)據(jù)。在這種情況下,當(dāng)主機(jī)檢測(cè)到存在同步關(guān)系的可移動(dòng)存儲(chǔ)設(shè)備插入時(shí),應(yīng)用主機(jī)中的數(shù)據(jù)替換可移動(dòng)存儲(chǔ)設(shè)備中的數(shù)據(jù),以達(dá)到數(shù)據(jù)同步的目的。綜上所述,移動(dòng)存儲(chǔ)同步關(guān)系到數(shù)據(jù)的準(zhǔn)確性及一致性。為實(shí)現(xiàn)良好的數(shù)據(jù)同步效果,要求所使用的同步軟件應(yīng)該是“雙向”的,即既可實(shí)現(xiàn)從源主機(jī)到可移動(dòng)存儲(chǔ)設(shè)備的同步,也可以實(shí)現(xiàn)可移動(dòng)存儲(chǔ)設(shè)備到源主機(jī)中同步。二、 系統(tǒng)設(shè)計(jì)2.1 系統(tǒng)功能
7、實(shí)現(xiàn)主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備間的數(shù)據(jù)同步,應(yīng)包含以下幾個(gè)步驟:設(shè)置同步映射、等待插入移動(dòng)存儲(chǔ)設(shè)備、掃描主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備、判定與更新。2.1.1設(shè)置同步映射一個(gè)同步映射組合包括本地磁盤(pán)中的路徑、目的可移動(dòng)磁盤(pán)中的路徑。兩個(gè)路徑除了驅(qū)動(dòng)器序號(hào)不同以外,其余的部分應(yīng)完全相同。如,本地磁盤(pán)中的路徑為C:Promgram files,若目標(biāo)可移動(dòng)磁盤(pán)的驅(qū)動(dòng)充序號(hào)為K,則目標(biāo)路徑應(yīng)為K:Program files。2.1.2等待插入移動(dòng)存儲(chǔ)設(shè)備程序在一般情況下處理監(jiān)聽(tīng)狀態(tài),等待外部可移動(dòng)存儲(chǔ)設(shè)備與主機(jī)連接。當(dāng)接收到插入可移動(dòng)磁盤(pán)的消息時(shí),程序?qū)⒛軌蜃詣?dòng)啟動(dòng)同步模塊,開(kāi)始主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備的數(shù)據(jù)同步。2.
8、1.3掃描主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備檢測(cè)到有可移動(dòng)的存儲(chǔ)設(shè)備插入后,程序?qū)⑦M(jìn)入同步狀態(tài),第一輪掃描可移動(dòng)磁盤(pán)中的文件列表,第二輪掃描主機(jī)中源路徑的文件列表。2.1.4判定與更新在掃描的過(guò)程中,若發(fā)現(xiàn)有較新的文件(最后修改時(shí)間較晚),則用新的文件替換舊的文件。若掃描時(shí)發(fā)現(xiàn)只存在于一方的文件,則把該文件復(fù)制到另一方中。若掃描時(shí)發(fā)現(xiàn)只存在于一方的文件夾,則在另一方也創(chuàng)建相應(yīng)的文件夾。2.2 系統(tǒng)平臺(tái)目前Windows 操作系統(tǒng)占據(jù)桌面操作系統(tǒng)90%以上的份額,大多數(shù)用戶(hù)習(xí)慣于使用Windows操作系統(tǒng)。因此此軟件運(yùn)行在Windows操作系統(tǒng)。2.3 系統(tǒng)框架此程序使用Microsoft .NET Fram
9、ework框架,考慮到4月8日Windows XP停止服務(wù)后中的的XP用戶(hù)比例仍高達(dá)60%,為了兼容Windows XP操作系統(tǒng),此程序的.NET Framework版本定為2.0。2.4 系統(tǒng)開(kāi)發(fā)語(yǔ)言程序使用C#語(yǔ)言開(kāi)發(fā),IDE為Microsoft Visual Studio 2013。2.5 系統(tǒng)界面設(shè)計(jì) 程序的界面應(yīng)由三部分組成:添加同步映射、查看當(dāng)前所有同步映射、同步消息。最終程序界面如圖1- 圖3所示。圖1 添加同步映射組合界面圖2 瀏覽同步列表界面圖3 同步消息列表界面2.6 系統(tǒng)模塊劃分程序整體可劃分為9個(gè)模塊:添加同步映射、存取同步映射、監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備、獲取存儲(chǔ)設(shè)備信息、映
10、射轉(zhuǎn)換、獲取文件列表、文件更新與替換與消息輸出。2.6.1 添加同步映射一對(duì)同步映射組合包含本地文件夾與目標(biāo)文件夾。其中目標(biāo)文件夾必須是位于某個(gè)可移動(dòng)存儲(chǔ)設(shè)備中。若當(dāng)前沒(méi)有檢測(cè)到可移動(dòng)存儲(chǔ)設(shè)備,則添加同步映射模塊不可用。防止在兩個(gè)本地路徑之間建立同步關(guān)系。當(dāng)監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備模塊檢測(cè)到有可移動(dòng)存儲(chǔ)設(shè)備插入時(shí),則啟用添加同步映射模塊,此時(shí)方可添加同步映射。2.6.2 存取同步映射此模塊用于從磁盤(pán)文件中讀取用戶(hù)設(shè)置的同步映射組合。當(dāng)程序啟動(dòng)時(shí),將自動(dòng)從預(yù)定的文件中讀取用戶(hù)先前設(shè)置的同步映射組合來(lái)初始化程序。當(dāng)程序添加新的同步映射組合時(shí),該模塊又會(huì)將新增的同步映射組合存儲(chǔ)到文件中。2.6.3 監(jiān)聽(tīng)可
11、移動(dòng)存儲(chǔ)設(shè)備此模塊又可分為兩個(gè)部分:獲取可移動(dòng)磁盤(pán)列表與監(jiān)視USB接口。獲取可移動(dòng)磁盤(pán)列表操作為用戶(hù)異步發(fā)起。當(dāng)用戶(hù)點(diǎn)擊添加同步映射組合頁(yè)面中的“刷新”按鈕時(shí),將啟用獲取可移動(dòng)磁盤(pán)列表子模塊,掃描當(dāng)前插入到計(jì)算機(jī)中的所有可移動(dòng)存儲(chǔ)設(shè)備,并把掃描結(jié)果填入到“可移動(dòng)存儲(chǔ)設(shè)備”組合框中。監(jiān)視USB接口模塊由操作系統(tǒng)發(fā)起,當(dāng)有可移動(dòng)存儲(chǔ)設(shè)備插入到計(jì)算機(jī)時(shí),操作系統(tǒng)將能檢測(cè)到這一消息,并把該事件發(fā)送到本程序的消息隊(duì)列中。當(dāng)本程序接收到由操作系統(tǒng)發(fā)來(lái)的消息時(shí),將調(diào)用其他模塊以完成同步操作。2.6.4 獲取存儲(chǔ)設(shè)備信息設(shè)備的信息按照類(lèi)型的不同,可分為兩類(lèi):靜態(tài)信息與動(dòng)態(tài)信息。所謂靜態(tài)信息,是指該可移動(dòng)存儲(chǔ)設(shè)
12、備固有的、不可更改的屬性,如該可移動(dòng)存儲(chǔ)設(shè)備的序列號(hào)。一個(gè)序列號(hào)是一個(gè)可移動(dòng)存儲(chǔ)設(shè)備的唯一標(biāo)識(shí),通過(guò)該序列號(hào),可唯一標(biāo)識(shí)出某個(gè)中移動(dòng)存儲(chǔ)設(shè)備。此外,通過(guò)序列號(hào),設(shè)備生產(chǎn)商能夠查出對(duì)應(yīng)設(shè)備的出廠日期,設(shè)備版本,設(shè)備類(lèi)型,芯片制造商,芯片型號(hào)等等。此程序中使用磁盤(pán)序列號(hào)僅僅是為了標(biāo)識(shí)不同的設(shè)備,不深入研究其具體的參數(shù)。動(dòng)態(tài)信息具體指該可移動(dòng)存儲(chǔ)設(shè)備在主機(jī)中的驅(qū)動(dòng)器序列。同一個(gè)可移動(dòng)存儲(chǔ)設(shè)備可能在不同主機(jī)或同一主機(jī)的不同時(shí)刻擁有不同的驅(qū)動(dòng)器序號(hào),因此不能僅僅以驅(qū)動(dòng)器序號(hào)來(lái)標(biāo)識(shí)一個(gè)可移動(dòng)存儲(chǔ)設(shè)備。但在獲取文件路徑時(shí),必須能夠準(zhǔn)確地獲取該可移動(dòng)存儲(chǔ)設(shè)備當(dāng)前的驅(qū)動(dòng)器序列。這就要求程序在內(nèi)部在建立和維護(hù)一張
13、可移動(dòng)存儲(chǔ)設(shè)備的靜態(tài)信息-動(dòng)態(tài)信息表,能名根據(jù)可移動(dòng)存儲(chǔ)設(shè)備的序列號(hào)獲取當(dāng)前的驅(qū)動(dòng)器序號(hào),并拼接成一個(gè)完整且正確的路徑。2.6.5 映射轉(zhuǎn)換映射轉(zhuǎn)換是可移動(dòng)存儲(chǔ)設(shè)備的靜態(tài)信息到動(dòng)態(tài)信息的轉(zhuǎn)換。在存儲(chǔ)同步映射組合時(shí),實(shí)際存儲(chǔ)的是靜態(tài)映射,其在磁盤(pán)中的存儲(chǔ)形式為:位于本地磁盤(pán)上的完整路徑->磁盤(pán)序列號(hào)目標(biāo)文件夾在磁盤(pán)中除驅(qū)動(dòng)器序號(hào)以外的路徑。如:位于C盤(pán)上的Program files文件夾要與位于某一可移動(dòng)磁盤(pán)上的Program files建立同步關(guān)系,假設(shè)該可移動(dòng)磁盤(pán)的序列號(hào)為123456, 則該靜態(tài)映射為:C:Program files -> 123456Program files
14、。在進(jìn)行同步操作時(shí),應(yīng)將此靜態(tài)映射轉(zhuǎn)換為動(dòng)態(tài)映射,其在內(nèi)存中的存儲(chǔ)形式為:位于本地磁盤(pán)上的完整路徑->磁盤(pán)動(dòng)態(tài)驅(qū)動(dòng)器序號(hào)+目標(biāo)文件夾在磁盤(pán)中除驅(qū)動(dòng)器序號(hào)以外的路徑。如上例,假設(shè)序列號(hào)為123456的磁盤(pán)插入到計(jì)算機(jī)后為其分配的驅(qū)動(dòng)器序號(hào)為K,則其動(dòng)態(tài)映射為:C:Program files -> K:Program files。2.6.6 獲取文件列表獲取文件列表是指獲取映射雙方的文件夾下的所有文件,包括子文件夾下的文件。當(dāng)進(jìn)行文件同步時(shí),將根據(jù)此文件列表逐個(gè)比較,找較新的文件替換較舊的文件。2.6.7 文件更新與替換所謂文件更新,是指當(dāng)存在僅存在一某一方的文件或文件夾,應(yīng)將其復(fù)制到
15、另一方中,使同步雙方的文件和文件夾數(shù)量達(dá)到一致。所謂替換,是指在掃描文件列表時(shí),若發(fā)現(xiàn)某一方的文件較新,則用該文件替換另一方的同名文件,以達(dá)到文件同步的目的。文件的“新”與“舊”的判定是通過(guò)獲取該文件的“最后修改時(shí)間”屬性。若文件A的最后修改時(shí)間大于文件B的最后修改時(shí)間,說(shuō)明文件A的編輯時(shí)間較晚,該文件較“新”。2.6.8 消息輸出在進(jìn)行文件同步時(shí),應(yīng)同時(shí)輸出消息反饋給用戶(hù),讓用戶(hù)清楚具體對(duì)哪些文件進(jìn)行了更新,具體執(zhí)行了哪些更新操作。根據(jù)更新的類(lèi)型,消息可分為2種類(lèi)型:更新信息與替換信息。當(dāng)發(fā)生文件更新操作,即把只存在于某一方的文件或文件夾復(fù)制到另一方時(shí),輸出更新信息。更新信息的形式如圖3中的
16、消息列表中的第二行所示。當(dāng)有新舊文件發(fā)生替換時(shí),輸出替換信息。替換信息的形式如圖中的消息列表中的第一行所示。2.6.9 響應(yīng)用戶(hù)操作響應(yīng)用戶(hù)操作,即控件控制模塊。具體為當(dāng)用戶(hù)按下某個(gè)按鈕,或點(diǎn)擊某個(gè)標(biāo)簽頁(yè)時(shí)作出的響應(yīng)。2.7 主要技術(shù)此程序在監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備時(shí)需要用到多線程技術(shù)。程序在進(jìn)行文件同步操作時(shí),需要對(duì)文件進(jìn)行操作,用到IO操作。三、編程實(shí)現(xiàn)3.1添加同步映射如圖1,在添加同步映射組合頁(yè)面中,設(shè)置相應(yīng)的路徑后,點(diǎn)擊“確定”按鈕,將添加一對(duì)同步映射組合到映射組合列表中。具體實(shí)現(xiàn)代碼如下:/ <summary>/ 添加同步組合/ </summary>/ <p
17、aram name="destPath">目的路徑</param>/ <para>如果目的路徑不存在,則創(chuàng)建</para>/ <param name="localPath">本地路徑</param>/ <para>如果本地路徑不存在,則拋出IOException異常</para>private void AddMap(string destPath, string localPath )if (!Directory.Exists(localPath)throw ne
18、w IOException("本地路徑不存在。");/ 如果目的路徑不存在,則創(chuàng)建if (!Directory.Exists(destPath)tryDirectory.CreateDirectory(destPath);catch (Exception ex)MessageBox.Show(ex.Message);string serial = UsbSerial.GetSerialNumber(boBoxDrive.Text.Substring(0, 1);destPath = serial + "" + destPath.Substring(des
19、tPath.IndexOf("") + 1);if (this.staticMapList.ContainsValue(destPath)throw new Exception("已存在該同步組合。");elsethis.staticMapList.Add(destPath, localPath);this.StoreMap(destPath, localPath);3.2存取同步映射當(dāng)程序啟動(dòng)時(shí),需要從文件中讀取先前設(shè)置好的同步映射組合列表。讀取列表分為兩個(gè)部分,第一是把讀取的同步映射組合列表顯示到如圖2所示的列表框中,方便用戶(hù)查看當(dāng)前存在哪些同步映射
20、組合。該部分的實(shí)現(xiàn)代碼如下:/ <summary>/ 從文件中載入同步組合到列表框中/ </summary>private void LoadMapsFromFile()if (!File.Exists(this.datafilePath)return;using (FileStream fs = new FileStream(this.datafilePath, FileMode.Open, FileAccess.Read)StreamReader sr = new StreamReader(fs);ListViewItem item;string readLine
21、= ""int index = 0;while (sr.Peek() > -1)item = new ListViewItem();readLine = sr.ReadLine();index = readLine.IndexOf("");item.Text = readLine.Substring(0, index); / 添加U盤(pán)序列號(hào)item.SubItems.Add(readLine.Substring(index + 1);/ 添加目標(biāo)文件夾item.SubItems.Add(sr.ReadLine();this.listViewMap.
22、Items.Add(item);sr.Close();第二部分是載入同步映射組合列表到內(nèi)存中的mapList中,用于在實(shí)際同步時(shí)獲取同步映射組合,該部分的實(shí)現(xiàn)代碼如下:/ <summary>/ 從文件中讀取同步組合來(lái)初始化mapList/ </summary>private void InitializeMapList()if (!File.Exists(this.datafilePath)return;using (FileStream fs = new FileStream(this.datafilePath, FileMode.Open, FileAccess.R
23、ead)StreamReader sr = new StreamReader(fs);while (sr.Peek() > -1)this.staticMapList.Add(sr.ReadLine(), sr.ReadLine();sr.Close();3.3監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備監(jiān)聽(tīng)可移動(dòng)存儲(chǔ)設(shè)備需要重寫(xiě)當(dāng)前主窗體的WndProc()方法,該方法用于接收Windows操作系統(tǒng)發(fā)來(lái)的消息。當(dāng)接收到有可移動(dòng)磁盤(pán)插入的消息時(shí),WndProc()方法將觸發(fā)DisksInserted事件,在DisksInserted事件的事件處理程序中,將依次調(diào)用RefleshComboBoxDrive()方法和
24、Synchronise()方法。其中RefleshComboBoxDrive()用于刷新當(dāng)前的甩的可移動(dòng)磁盤(pán)列表。而Synchronise()將實(shí)現(xiàn)文件同步操作。WndProc()的實(shí)現(xiàn)代碼如下:protected override void WndProc(ref Message m)tryif (m.Msg = WM_DEVICECHANGE)switch (m.WParam.ToInt32()case DBT_DEVICEARRIVAL:/U盤(pán)插入DriveInfo uin = DriveInfo.GetDrives();this.InsertedDiskIndex = new List
25、<string>();foreach (DriveInfo drive in uin)if (drive.DriveType = DriveType.Removable)this.InsertedDiskIndex.Add(drive.Name);if (this.DisksInserted != null)this.DisksInserted(this, null);break;case DBT_DEVICEREMOVECOMPLETE: /U盤(pán)卸載break;default: break;catch (Exception ex)MessageBox.Show(ex.Messag
26、e);base.WndProc(ref m);3.4獲取存儲(chǔ)設(shè)備信息存儲(chǔ)設(shè)備的信息主要是指可移動(dòng)磁盤(pán)的序列號(hào)。因獲取可移動(dòng)磁盤(pán)序列號(hào)操作涉及較多的底層操作,使用一個(gè)類(lèi)UsbSerial封閉這些操作,并提供一個(gè)靜態(tài)的方法GetSerialNumber()用于獲取給定磁盤(pán)的序列號(hào)。GetSerialNumber()方法的實(shí)現(xiàn)代碼如下:/ <summary>/ 通過(guò)磁盤(pán)的盤(pán)符獲取該磁盤(pán)的序列號(hào)/ </summary>/ <param name="driveName">磁盤(pán)的盤(pán)符</param>/ <para>如 C: 或
27、 C</para>/ <returns>返回給定磁盤(pán)的序列號(hào)</returns>public static string GetSerialNumber(string driveName)innerDriveName = driveName.ToUpper();if (!innerDriveName.Contains(":")innerDriveName += ":"if (innerDriveName.Contains("")innerDriveName = innerDriveName.Subs
28、tring(0, 2);Thread th = new Thread(new ThreadStart(MatchDriveNameWithSerial);th.Start();th.Join();return innerSerialNumber;3.5映射轉(zhuǎn)換映射轉(zhuǎn)換完成從靜態(tài)映射到動(dòng)態(tài)映射的轉(zhuǎn)換過(guò)程。獲取動(dòng)態(tài)映射的過(guò)程分為以下三個(gè)步驟:(1) 獲取插入的可移動(dòng)磁盤(pán)的序列號(hào),實(shí)現(xiàn)該過(guò)程的方法為GetInsertedDisksSerialnumber()。(2) 根據(jù)獲取的磁盤(pán)序列號(hào)集合獲取對(duì)應(yīng)的靜態(tài)映射集合,實(shí)現(xiàn)該過(guò)程的方法為GetInsertedDisksStaticMaps()。(3) 根
29、據(jù)靜態(tài)映射集合獲取動(dòng)態(tài)映射集合,實(shí)現(xiàn)該過(guò)程的方法為GetDynamicMaps。調(diào)用GetDynamicMaps方法前應(yīng)先調(diào)用GetInsertedDisksSerialnumber()和GetInsertedDisksStaticMaps()獲取相應(yīng)的結(jié)果作為GetDynamicMaps()方法的參數(shù)。GetDynamicMaps()實(shí)現(xiàn)代碼如下:/ <summary>/ 通過(guò)靜態(tài)同步映射關(guān)系集合獲取當(dāng)前的動(dòng)態(tài)同步映射關(guān)系集合/ </summary>/ <param name="staticMapsList">一個(gè)靜態(tài)同步映射關(guān)系組合的
30、集合</param>/ <returns>返回一個(gè)動(dòng)態(tài)同步映射關(guān)系組合的集合</returns>private Dictionary<string, string> GetDynamicMaps(Dictionary<string, string> staticMapsList)Dictionary<string, string> dynamicMaps = new Dictionary<string, string>();string path = "" / 除驅(qū)動(dòng)器序號(hào)以外的路徑fore
31、ach (KeyValuePair<string, string> map in staticMapsList)foreach (KeyValuePair<string, string> disk in this.diskName_SerialnumberMaps)if (map.Key.Substring(0, map.Key.IndexOf("") = disk.Key)path = map.Key.Substring(map.Key.IndexOf("") + 1);dynamicMaps.Add(disk.Value +
32、"" + path, map.Value);return dynamicMaps;3.6獲取文件列表該模塊主要是獲取指定目錄下的所有文件,并存儲(chǔ)在一個(gè)List<string>集合對(duì)象中。指定目錄下的所有文件包括該目錄下的文件及其子孫目錄下的所有文件。主要實(shí)現(xiàn)方法GetDescendantFiles()的實(shí)現(xiàn)代碼如下:/ <summary>/ 獲取指定目錄下的所有文件/ </summary>/ <param name="path">獲取文件的目錄</param>/ <param name=&
33、quot;filesList">用于存放文件列表的List<string>實(shí)例</param>private void GetDescendantFiles(DirectoryInfo path, List<string>filesList)filesList.AddRange(Directory.GetFiles(path.FullName);foreach (DirectoryInfo dir in path.GetDirectories()GetDescendantFiles(dir, filesList);3.7文件替換與更新3.7.
34、1文件替換文件的替換是指用“新”的文件替換“舊”的文件。其主要實(shí)現(xiàn)方法為ReplaceOldFile(),該方法不僅能實(shí)現(xiàn)雙方新舊文件的替換,還能把在可移動(dòng)磁盤(pán)而不在本地磁盤(pán)的文件復(fù)制到本地磁盤(pán)中。其主要實(shí)現(xiàn)代碼如下:/ <summary>/ 更新分別位于本地和目標(biāo)磁盤(pán)的一對(duì)文件/ </summary>/ <param name="destPath">位于可移動(dòng)磁盤(pán)的目標(biāo)文件</param>/ <param name="localPath">位于本地路徑的文件</param>/ &l
35、t;returns>如果U盤(pán)的文件較新,返回0, 如果本地的文件新,返回1,文件在U盤(pán)中而不在本地磁盤(pán)中,返回2,否則返回-1</returns>private int ReplaceOldFile(string destPath, string localPath)/ 如果本地不存在相應(yīng)的文件,則從可移動(dòng)磁盤(pán)復(fù)制到本地磁盤(pán)tryif (!File.Exists(localPath)File.Copy(destPath, localPath, true);return 2;catch (Exception ex)if (ex.Message.IndexOf("未能找
36、到") > -1)Directory.CreateDirectory(localPath.Substring(0, localPath.LastIndexOf("");return ReplaceOldFile(destPath, localPath);tryDateTime destFileTime = File.GetLastWriteTime(destPath);DateTime localFileTime = File.GetLastWriteTime(localPath);/ U盤(pán)中的文件較新if (destFileTime > localF
37、ileTime)File.Copy(destPath, localPath, true);return 0;/ 本地的文件較新else if (destFileTime < localFileTime)File.Copy(localPath, destPath, true);return 1;elsereturn -1;catchMessageBox.Show(String.Format("同步文件 0 到 1 失敗。", destPath, localPath);return -1;3.7.2 文件更新文件的更新主要是把只存在于同一方的文件復(fù)制到另一方。為了提高效率
38、,存在于可移動(dòng)磁盤(pán)而不存在于本地磁盤(pán)的文件在替換的過(guò)程中已經(jīng)同時(shí)完成。為了更新存在于本地磁盤(pán)而不存在于可移動(dòng)磁盤(pán)的文件,需要使用方法CheckFileExistsInRemoveableDisk(),再進(jìn)行一次掃描,該方法的主要實(shí)現(xiàn)代碼如下:/ <summary>/ 檢測(cè)本地磁盤(pán)中的文件是否存在于U盤(pán)中,如果不存在,則從本地磁盤(pán)復(fù)制到U盤(pán)中/ </summary>/ <param name="localPath">本地磁盤(pán)文件路徑</param>/ <param name="destPath">
39、可移動(dòng)磁盤(pán)文件路徑</param>/ <returns>如果有從本地磁盤(pán)復(fù)制文件到可移動(dòng)磁盤(pán)中,返回true,否則返回false</returns>private bool CheckFileExistsInRemoveableDisk(string localPath, string destPath)if (!File.Exists(destPath)tryFile.Copy(localPath, destPath,true);return true;catchDirectory.CreateDirectory(destPath.Substring(0,
40、 destPath.LastIndexOf("");return CheckFileExistsInRemoveableDisk(localPath, destPath);/MessageBox.Show(ex.Message);/return false;return false;3.8消息輸出消息輸出是為了讓用戶(hù)知道程序做了哪些操作,消息會(huì)顯示在圖3所示的消息列表中。在同步的過(guò)程中,同步模塊會(huì)根據(jù)同步進(jìn)行的具體操作(替換和更新),以及操作對(duì)象的文件名,生成一條消息,并保存到一個(gè)臨時(shí)消息鏈表中。在同步模塊完成后,由消息輸出模塊統(tǒng)一輸出到消息列表中。實(shí)現(xiàn)輸出消息列表的主要代
41、碼如下:/ <summary>/ 更新消息列表/ </summary>/ <param name="messagesList">需要添加到消息列表中的消息集合</param>private void UpdateMessageListBox(List<string> messagesList)if (messagesList.Count > 0)foreach (string msg in messagesList)this.listBoxMessage.Items.Add(msg);3.9響應(yīng)用戶(hù)操作此模塊
42、主要用于響應(yīng)用戶(hù)的操作。如主菜單、右鍵菜單及按鈕上的操作。如保存消息列表中的消息到文件中:/ 保存消息到文件private void 保存SToolStripMenuItem_Click(object sender, EventArgs e)SaveFileDialog saveDlg = new SaveFileDialog();saveDlg.Filter = "文本文件(*.txt)|*.txt|所有文件(*.*)|*.*"if (DialogResult.OK = saveDlg.ShowDialog()using (FileStream fs = new FileStream(saveDlg.FileName, FileMode.Create, FileAccess.Write)StreamWriter sw = new Stre
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- Module2 Unit1 Whats your name(說(shuō)課稿)-2024-2025學(xué)年外研版(一起)英語(yǔ)一年級(jí)上冊(cè)
- 2《吃水不忘挖井人》(說(shuō)課稿)-2024-2025學(xué)年統(tǒng)編版(2024)語(yǔ)文一年級(jí)下冊(cè)
- 15《搭船的鳥(niǎo)》說(shuō)課稿-2024-2025學(xué)年統(tǒng)編版語(yǔ)文三年級(jí)上冊(cè)
- 2023八年級(jí)數(shù)學(xué)上冊(cè) 第三章 位置與坐標(biāo)2 平面直角坐標(biāo)系第3課時(shí) 建立適當(dāng)?shù)钠矫嬷苯亲鴺?biāo)系求點(diǎn)的坐標(biāo)說(shuō)課稿 (新版)北師大版
- 15堅(jiān)持才會(huì)有收獲(說(shuō)課稿)-部編版道德與法治二年級(jí)下冊(cè)
- 2023七年級(jí)道德與法治上冊(cè) 第二單元 友誼的天空 第五課 交友的智慧 第2框 網(wǎng)上交友新時(shí)空說(shuō)課稿 新人教版
- 1假期有收獲 說(shuō)課稿-2023-2024學(xué)年道德與法治二年級(jí)上冊(cè) 統(tǒng)編版
- 2025外墻紙皮磚合同
- 6的乘法口訣(說(shuō)課稿)-2024-2025學(xué)年人教版數(shù)學(xué)二年級(jí)上冊(cè)
- Unit 3 Fascinating Parks Discover useful structures 說(shuō)課稿-2024-2025學(xué)年高中英語(yǔ)人教版(2019)選擇性必修第一冊(cè)
- 建材材料合作合同范例
- 2025年集體經(jīng)濟(jì)發(fā)展計(jì)劃
- 病歷書(shū)寫(xiě)規(guī)范細(xì)則(2024年版)
- 2024-2025學(xué)年人教版八年級(jí)上冊(cè)地理期末測(cè)試卷(二)(含答案)
- 雙方共同買(mǎi)車(chē)合同范例
- 醫(yī)務(wù)從業(yè)人員行為規(guī)范培訓(xùn)
- 中小學(xué)校食品安全管理現(xiàn)狀與膳食經(jīng)費(fèi)優(yōu)化方案
- 中醫(yī)外治法課件
- 第15屆-17屆全國(guó)中學(xué)生物理競(jìng)賽預(yù)賽試卷含答案
- 道路運(yùn)輸企業(yè)主要負(fù)責(zé)人和安全生產(chǎn)管理人員安全考核題(公共部分題+專(zhuān)業(yè)部分題)及答案
- 外研版小學(xué)英語(yǔ)(三起點(diǎn))六年級(jí)上冊(cè)期末測(cè)試題及答案(共3套)
評(píng)論
0/150
提交評(píng)論