最近要開發一個基於python的合併文件夾/目錄的程序,原本的想法是基於修改時間的比較,即判斷文件有沒有改變,比較兩個文件的修改時間便可。這個想法在windows的pc端下測試沒有問題。php
可是當把一個文件從pc端複製到優盤時出現了一個問題,複製到優盤的文件比pc端的文件慢了兩秒鐘!html
這裏我用的複製函數是 shutil.copy2(),理論上它會把修改時間和最後訪問時間也複製過來1,可是實際狀況並非徹底相同。python
詳細狀況我在segmentfault裏提出了問題:爲何將一個文件從pc中複製到優盤中修改時間會慢2秒鐘?算法
看shutil.copy2的資料和網上的解答,發現多是文件系統的差異形成的,windows的pc端文件系統是ntfs,優盤的是fat32。但仍是想了解更深層的緣由,但願知道的大神解答一下。segmentfault
扯遠了,基於以上問題的出現,迫使我得修改比較策略,因而我找到了用文件的MD5值比較的方法,yeah!~windows
具體來講,每一個文件都會有一個MD5的加密值,這個值來惟一標識這個文件(百度雲的快速上傳/秒傳就是基於這個道理),它經常使用來辨別文件的真僞,例以下載系統安裝鏡像,旁邊會附帶一個長長的字符亂碼,這就是這個鏡像的MD5值。函數
文件被修改後其MD5值也會改變,因此能夠用來判斷一個文件是否被修改過。post
這樣的方法比基於時間的比較顯然更加可靠,如今惟一的問題就是MD5計算時間的問題。一個大文件計算MD5值要多久呢?測試
網上的解決代碼已經有不少了,大都是兩種方法,一種是小文件的MD5加密,調用函數直接加密便可,另外一種是大文件的MD5加密策略,方法是將大文件分塊更新MD5值,最後獲得最終的值。加密
下面我使用第二種方法對大文件進行加密測試。
測試對象是一個將近2G的壓縮文件,以下:
加密結果以下:
運行時間是20s,不快也不慢,相對文件大小來講,我仍是能接受這個速度……
計算出的MD5值是「8ee04176f69c10ca56f2358d51d792ed」,這個值對不對呢?我在網上作了驗證:
兩個值相等,因而可知該算法,計算正確。測試代碼見下。
測試網址在這:http://www.atool.org/file_hash.php
有趣的是,我對文件進行了第二次、第三次、第四次加密,發現加密時間少了5秒左右,好神奇,不知道爲何。
搞定了MD5加密,我能夠繼續進行下一步開發了~ :)
1 # coding=gbk 2 3 import hashlib 4 import os 5 import datetime 6 7 def GetFileMd5(filename): 8 if not os.path.isfile(filename): 9 return 10 myhash = hashlib.md5() 11 f = open(filename,'rb') 12 while True: 13 b = f.read(8096) 14 if not b : 15 break 16 myhash.update(b) 17 f.close() 18 return myhash.hexdigest() 19 20 filepath = raw_input('請輸入文件路徑:') 21 22 # 輸出文件的md5值以及記錄運行時間 23 starttime = datetime.datetime.now() 24 print GetFileMd5(filepath) 25 endtime = datetime.datetime.now() 26 print '運行時間:%ds'%((endtime-starttime).seconds)
Freecode# : www.cnblogs.com/yym2013