入職之後接到的第一個代碼任務是一個小測試。做一個檔案單向同步軟體。
将檔案夾A内的檔案夾和檔案同步到檔案夾B。
其實需求也就那麼一句話,沒啥還需要解釋的了吧。詳細點說,需要同步檔案/檔案夾的“新增,删除,重命名,修改”。
是采用遞歸,周遊整個源目錄,對比目标目錄。
如果目标目錄下沒有相對應的檔案,将檔案複制到目标目錄;
如果檔案在兩個路徑下都存在,但是檔案大小和最後寫入時間不一緻時,将原目錄下的檔案複制到目标目錄下;
如果檔案存在于目标目錄下而不存在源目錄下,則将目标路徑下的檔案删除。
知道如何比較之後就可以進行遞歸周遊檔案夾了。這個是這個軟體實作的難點之一,其實也沒多難,也就是說這個軟體根本就沒多難。以下是遞歸函數:
<a></a>
測試了一下結果,在9000+個檔案,40+個檔案夾下,在我這部破機器上面單純遞歸周遊(不複制檔案)的時候需要的時間是截枝的十倍以上。簡直是隻烏龜。。。
函數GetDirectoryLength(string path)的作用是檢查檔案夾path的大小。這裡隻是簡單地對比兩個檔案夾的大小,如果大小一緻,則截枝不遞歸,否則遞歸。這種方式的效率非常高,因為很多時候并不是都在有檔案的複制,是以不需要經常去周遊目錄。是以截枝就好了。下面給出GetDirectoryLength(string path)函數的代碼。其實該函數也是一個遞歸,雖然會增加負荷,但是檔案多,檔案夾深的時候,是很有必要的。
擷取檔案夾大小
難點主要在遞歸和截枝的思想上面。其他方面的解釋可以直接檢視代碼。注釋已經很清楚了。下面是整個檔案的源代碼:
檔案同步
因為要求用配置檔案,配置原路徑,目的路徑等資訊,有必要說明一下這個問題。另外需要讀配置檔案,是以需要引用System.Configuration;命名空間。一下是配置檔案app.config代碼:
希望本篇文章對你有所用處。
本文轉自 Ron Ngai 部落格園部落格,原文連結:http://www.cnblogs.com/rond/archive/2012/07/19/2598489.html ,如需轉載請自行聯系原作者