移動(dòng)存儲(chǔ)同步程序_第1頁
移動(dòng)存儲(chǔ)同步程序_第2頁
移動(dòng)存儲(chǔ)同步程序_第3頁
移動(dòng)存儲(chǔ)同步程序_第4頁
移動(dòng)存儲(chǔ)同步程序_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、XXX大學(xué) 課 程 設(shè) 計(jì) 報(bào) 告移動(dòng)存儲(chǔ)同步程序課程名稱:計(jì)算機(jī)系統(tǒng)開發(fā)綜合訓(xùn)練院 (系): 信息科學(xué)與技術(shù)學(xué)院 專業(yè)班級: 計(jì)算機(jī)123班 學(xué) 號: XXX 姓 名: XXX 指導(dǎo)老師: XXX 源代碼下載:承諾書鄭重聲明:本人所呈交的課程設(shè)計(jì)是本人在導(dǎo)師指導(dǎo)下獨(dú)立撰寫并完成的,課程設(shè)計(jì)沒有剽竊、抄襲、造假等違反學(xué)術(shù)道德、學(xué)術(shù)規(guī)范和侵權(quán)行為。本課程設(shè)計(jì)不包含任何其他個(gè)人或集體已經(jīng)發(fā)表或撰寫過的研究成果,如果引用則標(biāo)識(shí)出了出處。對本課程設(shè)計(jì)的研究做出貢獻(xiàn)的個(gè)人和集體,均已在文中以明確方式標(biāo)明。課程設(shè)計(jì)與資料若有不實(shí)之處,本人承擔(dān)一切相關(guān)責(zé)任。特此聲明。 簽名: 年月 日目 錄一、需求分析11

2、.1 存儲(chǔ)同步概念11.2 存儲(chǔ)同步分類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)開發(fā)語言32.5 系統(tǒng)界面設(shè)計(jì)32.6 系統(tǒng)模塊劃分52.6.1 添加同步映射52.6.2 存取同步映射62.6.3 監(jiān)聽可移動(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)用戶操作82.7 主要技術(shù)8三、編程實(shí)現(xiàn)83.1添加同

3、步映射83.2存取同步映射93.3監(jiān)聽可移動(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)用戶操作20四、程序測試204.1 測試環(huán)境204.2 測試設(shè)備214.3 測試步驟214.4 測試結(jié)果22五、課程設(shè)計(jì)總結(jié)23參 考 文 獻(xiàn)25一、 需求分析1.1 存儲(chǔ)同步概念實(shí)現(xiàn)一份數(shù)據(jù)在多個(gè)存儲(chǔ)器中保持?jǐn)?shù)據(jù)一致稱為存儲(chǔ)同步。當(dāng)一份數(shù)據(jù)在多個(gè)存儲(chǔ)設(shè)備上存在復(fù)本時(shí),保證數(shù)據(jù)在所有存儲(chǔ)設(shè)備上的一致性顯得越來越重要。若數(shù)據(jù)在不同的存儲(chǔ)設(shè)備上的數(shù)據(jù)不一致,即數(shù)據(jù)不同步,則會(huì)出現(xiàn)“

4、臟數(shù)據(jù)”,等意想不到的后果。因此,實(shí)現(xiàn)數(shù)據(jù)的同步在如今大數(shù)據(jù)時(shí)代顯得尤為重要。通過使用相應(yīng)的數(shù)據(jù)同步軟件,指定需要同步的數(shù)據(jù), 可以實(shí)現(xiàn)數(shù)據(jù)的同步。1.2 存儲(chǔ)同步分類根據(jù)存儲(chǔ)設(shè)備分類,可分為云存儲(chǔ)同步和移動(dòng)存儲(chǔ)同步。云存儲(chǔ)是在云計(jì)算概念上延伸和發(fā)展出來的一個(gè)新的概念,是指通過集群應(yīng)用、網(wǎng)格技術(shù)或分布式文件系統(tǒng)等功能,將網(wǎng)絡(luò)中大量各種不同類型的存儲(chǔ)設(shè)備通過應(yīng)用軟件集合起來協(xié)同工作,共同對外提供數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)訪問功能的一個(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ī)檢測到有可移動(dòng)存儲(chǔ)設(shè)備插入時(shí),應(yīng)對本機(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ī)對所有插入的可移動(dòng)磁盤進(jìn)行掃描,確定是否有需要同步的文件。1.3 移動(dòng)存儲(chǔ)同步的意義移動(dòng)存儲(chǔ)是目前使用較廣也較方便的方式。該方式的主要特點(diǎn)是便捷與價(jià)格低廉。目前主要的移動(dòng)存儲(chǔ)設(shè)備有閃存設(shè)備,即U盤和移動(dòng)硬盤等。在主機(jī) 可移動(dòng)存儲(chǔ)設(shè)備同步模式下,通常是在主機(jī)中編輯好數(shù)據(jù),再通過可移動(dòng)存儲(chǔ)設(shè)備把該數(shù)據(jù)帶到另一臺(tái)主機(jī)中使用。在另一臺(tái)主同中使用的過程中,可能會(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ù)對數(shù)據(jù)進(jìn)行編輯,此時(shí)源主機(jī)中的數(shù)據(jù)為最后編輯的數(shù)據(jù),而可移動(dòng)存儲(chǔ)設(shè)備中的數(shù)據(jù)為臟數(shù)據(jù)。在這種情況下,當(dāng)主機(jī)檢測到存在同步關(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è)同步映射組合包括本地磁盤中的路徑、目的可移動(dòng)磁盤中的路徑。兩個(gè)路徑除了驅(qū)動(dòng)器序號不同以外,其余的部分應(yīng)完全相同。如,本地磁盤中的路徑為C:Promgram files,若目標(biāo)可移動(dòng)磁盤的驅(qū)動(dòng)充序號為K,則目標(biāo)路徑應(yīng)為K:Program files。2.1.2等待插入移動(dòng)存儲(chǔ)設(shè)備程序在一般情況下處理監(jiān)聽狀態(tài),等待外部可移動(dòng)存儲(chǔ)設(shè)備與主機(jī)連接。當(dāng)接收到插入可移動(dòng)磁盤的消息時(shí),程序?qū)⒛軌蜃詣?dòng)啟動(dòng)同步模塊,開始主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備的數(shù)據(jù)同步。2.

8、1.3掃描主機(jī)與可移動(dòng)存儲(chǔ)設(shè)備檢測到有可移動(dòng)的存儲(chǔ)設(shè)備插入后,程序?qū)⑦M(jìn)入同步狀態(tài),第一輪掃描可移動(dòng)磁盤中的文件列表,第二輪掃描主機(jī)中源路徑的文件列表。2.1.4判定與更新在掃描的過程中,若發(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ù)用戶習(xí)慣于使用Windows操作系統(tǒng)。因此此軟件運(yùn)行在Windows操作系統(tǒng)。2.3 系統(tǒng)框架此程序使用Microsoft .NET Fram

9、ework框架,考慮到4月8日Windows XP停止服務(wù)后中的的XP用戶比例仍高達(dá)60%,為了兼容Windows XP操作系統(tǒng),此程序的.NET Framework版本定為2.0。2.4 系統(tǒng)開發(fā)語言程序使用C#語言開發(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)聽可移動(dòng)存儲(chǔ)設(shè)備、獲取存儲(chǔ)設(shè)備信息、映

10、射轉(zhuǎn)換、獲取文件列表、文件更新與替換與消息輸出。2.6.1 添加同步映射一對同步映射組合包含本地文件夾與目標(biāo)文件夾。其中目標(biāo)文件夾必須是位于某個(gè)可移動(dòng)存儲(chǔ)設(shè)備中。若當(dāng)前沒有檢測到可移動(dòng)存儲(chǔ)設(shè)備,則添加同步映射模塊不可用。防止在兩個(gè)本地路徑之間建立同步關(guān)系。當(dāng)監(jiān)聽可移動(dòng)存儲(chǔ)設(shè)備模塊檢測到有可移動(dòng)存儲(chǔ)設(shè)備插入時(shí),則啟用添加同步映射模塊,此時(shí)方可添加同步映射。2.6.2 存取同步映射此模塊用于從磁盤文件中讀取用戶設(shè)置的同步映射組合。當(dāng)程序啟動(dòng)時(shí),將自動(dòng)從預(yù)定的文件中讀取用戶先前設(shè)置的同步映射組合來初始化程序。當(dāng)程序添加新的同步映射組合時(shí),該模塊又會(huì)將新增的同步映射組合存儲(chǔ)到文件中。2.6.3 監(jiān)聽可

11、移動(dòng)存儲(chǔ)設(shè)備此模塊又可分為兩個(gè)部分:獲取可移動(dòng)磁盤列表與監(jiān)視USB接口。獲取可移動(dòng)磁盤列表操作為用戶異步發(fā)起。當(dāng)用戶點(diǎn)擊添加同步映射組合頁面中的“刷新”按鈕時(shí),將啟用獲取可移動(dòng)磁盤列表子模塊,掃描當(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)將能檢測到這一消息,并把該事件發(fā)送到本程序的消息隊(duì)列中。當(dāng)本程序接收到由操作系統(tǒng)發(fā)來的消息時(shí),將調(diào)用其他模塊以完成同步操作。2.6.4 獲取存儲(chǔ)設(shè)備信息設(shè)備的信息按照類型的不同,可分為兩類:靜態(tài)信息與動(dòng)態(tài)信息。所謂靜態(tài)信息,是指該可移動(dòng)存儲(chǔ)設(shè)

12、備固有的、不可更改的屬性,如該可移動(dòng)存儲(chǔ)設(shè)備的序列號。一個(gè)序列號是一個(gè)可移動(dòng)存儲(chǔ)設(shè)備的唯一標(biāo)識(shí),通過該序列號,可唯一標(biāo)識(shí)出某個(gè)中移動(dòng)存儲(chǔ)設(shè)備。此外,通過序列號,設(shè)備生產(chǎn)商能夠查出對應(yīng)設(shè)備的出廠日期,設(shè)備版本,設(shè)備類型,芯片制造商,芯片型號等等。此程序中使用磁盤序列號僅僅是為了標(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)器序號,因此不能僅僅以驅(qū)動(dòng)器序號來標(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è)備的序列號獲取當(dāng)前的驅(qū)動(dòng)器序號,并拼接成一個(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)映射,其在磁盤中的存儲(chǔ)形式為:位于本地磁盤上的完整路徑->磁盤序列號目標(biāo)文件夾在磁盤中除驅(qū)動(dòng)器序號以外的路徑。如:位于C盤上的Program files文件夾要與位于某一可移動(dòng)磁盤上的Program files建立同步關(guān)系,假設(shè)該可移動(dòng)磁盤的序列號為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ǔ)形式為:位于本地磁盤上的完整路徑->磁盤動(dòng)態(tài)驅(qū)動(dòng)器序號+目標(biāo)文件夾在磁盤中除驅(qū)動(dòng)器序號以外的路徑。如上例,假設(shè)序列號為123456的磁盤插入到計(jì)算機(jī)后為其分配的驅(qū)動(dòng)器序號為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á)到文件同步的目的。文件的“新”與“舊”的判定是通過獲取該文件的“最后修改時(shí)間”屬性。若文件A的最后修改時(shí)間大于文件B的最后修改時(shí)間,說明文件A的編輯時(shí)間較晚,該文件較“新”。2.6.8 消息輸出在進(jìn)行文件同步時(shí),應(yīng)同時(shí)輸出消息反饋給用戶,讓用戶清楚具體對哪些文件進(jìn)行了更新,具體執(zhí)行了哪些更新操作。根據(jù)更新的類型,消息可分為2種類型:更新信息與替換信息。當(dāng)發(fā)生文件更新操作,即把只存在于某一方的文件或文件夾復(fù)制到另一方時(shí),輸出更新信息。更新信息的形式如圖3中的

16、消息列表中的第二行所示。當(dāng)有新舊文件發(fā)生替換時(shí),輸出替換信息。替換信息的形式如圖中的消息列表中的第一行所示。2.6.9 響應(yīng)用戶操作響應(yīng)用戶操作,即控件控制模塊。具體為當(dāng)用戶按下某個(gè)按鈕,或點(diǎn)擊某個(gè)標(biāo)簽頁時(shí)作出的響應(yīng)。2.7 主要技術(shù)此程序在監(jiān)聽可移動(dòng)存儲(chǔ)設(shè)備時(shí)需要用到多線程技術(shù)。程序在進(jìn)行文件同步操作時(shí),需要對文件進(jìn)行操作,用到IO操作。三、編程實(shí)現(xiàn)3.1添加同步映射如圖1,在添加同步映射組合頁面中,設(shè)置相應(yīng)的路徑后,點(diǎn)擊“確定”按鈕,將添加一對同步映射組合到映射組合列表中。具體實(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所示的列表框中,方便用戶查看當(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盤序列號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>/ 從文件中讀取同步組合來初始化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)聽可移動(dòng)存儲(chǔ)設(shè)備監(jiān)聽可移動(dòng)存儲(chǔ)設(shè)備需要重寫當(dāng)前主窗體的WndProc()方法,該方法用于接收Windows操作系統(tǒng)發(fā)來的消息。當(dāng)接收到有可移動(dòng)磁盤插入的消息時(shí),WndProc()方法將觸發(fā)DisksInserted事件,在DisksInserted事件的事件處理程序中,將依次調(diào)用RefleshComboBoxDrive()方法和

24、Synchronise()方法。其中RefleshComboBoxDrive()用于刷新當(dāng)前的甩的可移動(dòng)磁盤列表。而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盤插入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盤卸載break;default: break;catch (Exception ex)MessageBox.Show(ex.Messag

26、e);base.WndProc(ref m);3.4獲取存儲(chǔ)設(shè)備信息存儲(chǔ)設(shè)備的信息主要是指可移動(dòng)磁盤的序列號。因獲取可移動(dòng)磁盤序列號操作涉及較多的底層操作,使用一個(gè)類UsbSerial封閉這些操作,并提供一個(gè)靜態(tài)的方法GetSerialNumber()用于獲取給定磁盤的序列號。GetSerialNumber()方法的實(shí)現(xiàn)代碼如下:/ <summary>/ 通過磁盤的盤符獲取該磁盤的序列號/ </summary>/ <param name="driveName">磁盤的盤符</param>/ <para>如 C: 或

27、 C</para>/ <returns>返回給定磁盤的序列號</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)換過程。獲取動(dòng)態(tài)映射的過程分為以下三個(gè)步驟:(1) 獲取插入的可移動(dòng)磁盤的序列號,實(shí)現(xiàn)該過程的方法為GetInsertedDisksSerialnumber()。(2) 根據(jù)獲取的磁盤序列號集合獲取對應(yīng)的靜態(tài)映射集合,實(shí)現(xiàn)該過程的方法為GetInsertedDisksStaticMaps()。(3) 根

29、據(jù)靜態(tài)映射集合獲取動(dòng)態(tài)映射集合,實(shí)現(xiàn)該過程的方法為GetDynamicMaps。調(diào)用GetDynamicMaps方法前應(yīng)先調(diào)用GetInsertedDisksSerialnumber()和GetInsertedDisksStaticMaps()獲取相應(yīng)的結(jié)果作為GetDynamicMaps()方法的參數(shù)。GetDynamicMaps()實(shí)現(xiàn)代碼如下:/ <summary>/ 通過靜態(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)器序號以外的路徑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>集合對象中。指定目錄下的所有文件包括該目錄下的文件及其子孫目錄下的所有文件。主要實(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)磁盤而不在本地磁盤的文件復(fù)制到本地磁盤中。其主要實(shí)現(xiàn)代碼如下:/ <summary>/ 更新分別位于本地和目標(biāo)磁盤的一對文件/ </summary>/ <param name="destPath">位于可移動(dòng)磁盤的目標(biāo)文件</param>/ <param name="localPath">位于本地路徑的文件</param>/ &l

35、t;returns>如果U盤的文件較新,返回0, 如果本地的文件新,返回1,文件在U盤中而不在本地磁盤中,返回2,否則返回-1</returns>private int ReplaceOldFile(string destPath, string localPath)/ 如果本地不存在相應(yīng)的文件,則從可移動(dòng)磁盤復(fù)制到本地磁盤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盤中的文件較新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)磁盤而不存在于本地磁盤的文件在替換的過程中已經(jīng)同時(shí)完成。為了更新存在于本地磁盤而不存在于可移動(dòng)磁盤的文件,需要使用方法CheckFileExistsInRemoveableDisk(),再進(jìn)行一次掃描,該方法的主要實(shí)現(xiàn)代碼如下:/ <summary>/ 檢測本地磁盤中的文件是否存在于U盤中,如果不存在,則從本地磁盤復(fù)制到U盤中/ </summary>/ <param name="localPath">本地磁盤文件路徑</param>/ <param name="destPath">

39、可移動(dòng)磁盤文件路徑</param>/ <returns>如果有從本地磁盤復(fù)制文件到可移動(dòng)磁盤中,返回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消息輸出消息輸出是為了讓用戶知道程序做了哪些操作,消息會(huì)顯示在圖3所示的消息列表中。在同步的過程中,同步模塊會(huì)根據(jù)同步進(jìn)行的具體操作(替換和更新),以及操作對象的文件名,生成一條消息,并保存到一個(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)用戶操作此模塊

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

最新文檔

評論

0/150

提交評論