使用Python編寫的檔案備份程式
阿新 • • 發佈:2019-02-13
作為程式設計師平時需要備份許多東西,生怕有些檔案改了就找不回來了,尤其是U盤裡的經常會被修改,而我又不能一個檔案一個檔案的對比著去備份,全複製又太浪費時間,網上關於備份的程式很多,但有很多限制,沒有我想要的功能,而且有的還會收費,所以決定自己來造個輪子。
平時用PHP比較多,我也有想過用PHP寫一個類似的檔案遊覽器,但這個輪子就造的有些大了,我只是想自動備份U盤裡的東西,能夠自動對比匹配目標檔案就可以,不需要太臃腫,而Python簡單,快速,連介面都不用寫,每次直接執行就行。所以我決定使用Python來編寫,原理就是對備份目錄進行遞迴,把找到的檔案和本地的檔案進行對比,對比時使用檔案生成md5碼來匹配,如果本地不存在,則建立目錄,再複製檔案。如果沒有Python環境,可以直接下載我編譯好的.exe程式直接使用,輸入時要注意,由於沒有寫圖形介面,資料夾的地址需要輸入,一定要保證檔案地址的正確,如果是主碟符如d盤,直接寫’d:’,\n如果是資料夾,例如d盤下的test資料夾,則輸入d:/test。下面是原始碼,註釋寫的非常詳細,需要的可以按照自己的需求更改。
#-*- coding=utf8 -*-
#使用函式對指定目錄進行深層次遍歷,先列出來所有的檔案和目錄
#再去指定的目錄裡再次查詢檔案和目錄,一直深入下去
# 如果是檔案,就不再深入下去,而去判斷路徑是否存在於電腦中,
# 不存在則將其複製
import hashlib
import os
import shutil
#用於判斷兩個檔案是否相同,提取每個檔案中的前4位元組的內容然後輸出md5碼進行比較
def md5check(fname):
m = hashlib.md5()
with open(fname) as fobj:
while True:
data = fobj.read(4096 )
if not data:
break
m.update(data)
return m.hexdigest()
#檔案複製的函式
def copy(path):
new_path = path
new_path = new_path.replace(old_scoure, new_scoure) #將原碟符替換為我所要存放的目標碟符
print path + "---copy---" + new_path
if os.path.isfile(new_path): #如果目標檔案存在
old_md = md5check(path) #提取原始檔的md5
new_md = md5check(new_path) #提取目標檔案的md5
if old_md != new_md: #如果不相等,說明原始檔有修改
shutil.copy(path, new_path) #因為已經判斷了目標檔案的存在,所以不需要建立目錄,直接複製就可以
else: #如果目標檔案不存在
dirname = os.path.dirname(new_path) # 提取目標的目錄
if os.path.exists(dirname): #目錄存在
shutil.copy(path, new_path) #直接複製檔案
else: #目錄不存在
try:
os.makedirs(dirname) #使用多級目錄建立函式建立目錄
shutil.copy(path, new_path) #直接複製檔案
except WindowsError: #錯誤反饋,而不會停止操作
print "建立目錄出錯"
# 查詢所有目錄檔案的遞迴函式
def lsdir(forder):
path = os.listdir(forder) #分離出來的檔案列表
# print forder
# print path
for line in path: #逐個判斷
line = forder + "/" + line #沒有使用join函式,因為會出現 \
if (os.path.isdir(line)): #是目錄就繼續進行遞迴
lsdir(line)
else:
# path = os.path.join(forder,line)
# print 'l:'+line
copy(line) #將檔案的地址傳到copy函式中去複製
# break
def test():
print new_scoure
if __name__=='__main__':
# lsdir('e:/test')
global old_scoure
global new_scoure #設定為全域性變數
concent = "請保證地址的正確性,如果是主碟符如d盤,直接寫'd:',\n如果是資料夾,例如d盤下的test資料夾,則輸入d:/test"
c_unicode = concent.decode("utf-8") #為了在cmd顯示中文,需要進行轉碼
# c_gbk = c_unicode.encode("gbk")
print c_unicode
concent = "輸入要備份的檔案地址:"
c_unicode = concent.decode("utf-8")
print c_unicode
old_scoure = raw_input()
concent = "輸入備份檔案要存放的地址,請保證地址存在:"
c_unicode = concent.decode("utf-8")
print c_unicode
new_scoure = raw_input()
# path = 'e:/Markdown'
lsdir(old_scoure)
concent = "輸入任意鍵關閉"
c_unicode = concent.decode("utf-8")
print c_unicode
raw_input()