国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python實現SVN的目錄周期性備份實例

2020-01-04 18:02:55
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python實現SVN的目錄周期性備份,實例分析了Python實現SVN周期性備份的原理與實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了Python實現SVN的目錄周期性備份方法。分享給大家供大家參考。具體如下:

起因:今天用SVN時,不小心把遠程SVN服務器上的目錄刪掉了,然后在本地又手賤地還原了一下項目(eclipse中右鍵項目team => 還原),導致寫了大半天的代碼全部丟失,用多款數據恢復軟件恢復也無果。一怒之下寫了這個目錄周期性備份小工具,每隔5秒備份源目錄中的所有文件到目標目錄(保留結構),保證目標目錄中的文件只增不減。且每次只拷貝發生變化的文件(比較兩個文件的MD5值)。

思考:雖然SVN也是一個版本管理軟件,但在使用過程總覺得它的諸多操作挺別扭,相比而言Git更強大靈活。我自己理想中的版本控制軟件至少應該考慮到一些讓用戶產生較強挫敗的使用場景(也許大部分情況是因為用戶誤用,但如果誤用情況也能考慮到,才能更體現軟件的終極人文關懷嘛),比如刪除遠程服務器上的文件,我覺得應該設計成這樣:即使用戶刪除了文件,文件還應該在一個緩沖區中呆1天(或幾個小時,可以配置),然后由一個定時任務定時刪除緩沖區中停留時間超過1天的文件。而不是立即物理刪除。

TODO:

增加配置文件,做成命令行程序

md5_caculate.py:

 

 
  1. # -*- coding: utf-8 -*- 
  2. #!/usr/bin/python 
  3. from hashlib import md5 
  4. import os  
  5. def calMD5(str): 
  6. m = md5() 
  7. m.update(str) 
  8. return m.hexdigest() 
  9. def calMD5ForFile(file): 
  10. statinfo = os.stat(file) 
  11. if int(statinfo.st_size) / (1024*1024) >= 1000: 
  12. # print("File size > 1000, move to big file...") 
  13. return calMD5ForBigFile(file) 
  14. m = md5() 
  15. f = open(file, 'rb'
  16. m.update(f.read()) 
  17. f.close() 
  18. return m.hexdigest() 
  19. def calMD5ForFolder(dir, MD5File): 
  20. outfile = open(MD5File,'w'
  21. for root, subdirs, files in os.walk(dir): 
  22. for file in files: 
  23. filefullpath = os.path.join(root, file) 
  24. """print filefullpath""" 
  25. filerelpath = os.path.relpath(filefullpath, dir) 
  26. md5 = calMD5ForFile(filefullpath) 
  27. outfile.write(filerelpath+' '+md5+"/n"
  28. outfile.close() 
  29. def calMD5ForBigFile(file): 
  30. m = md5() 
  31. f = open(file, 'rb'
  32. buffer = 8192 # why is 8192 | 8192 is fast than 2048 
  33. while 1: 
  34. chunk = f.read(buffer) 
  35. if not chunk : break 
  36. m.update(chunk) 
  37. f.close() 
  38. return m.hexdigest() 
  39. if __name__=="__main__"
  40. print(calMD5ForFile("e:/test/target/a/b/rabbit.txt")) 

file_util.py:

 

 
  1. # -*- coding: utf-8 -*- 
  2. #!/usr/bin/python 
  3. import os,shutil 
  4. from md5_caculate import calMD5ForFile 
  5. # 拷貝源目錄到目標目錄 
  6. def copyDir(srcDir, dstDir): 
  7. if srcDir in dstDir: # 源目錄包含在目標目錄,則直接返回 
  8. return 
  9. if not os.path.isdir(srcDir): 
  10. print(srcDir, "路徑指定的源目錄不存在!"
  11. return
  12. if not os.path.exists(dstDir): # 目標目錄不存在時則創建 
  13. os.makedirs(dstDir) 
  14. for fileOrDirName in os.listdir(srcDir): # 源目錄下的所有文件(包括文件和目錄) TODO BUG:如果srcDir為一個空目錄? 
  15. # fileOrDirPath = srcDir + "/" + fileOrDirName 
  16. fileOrDirPath = os.path.join(srcDir, fileOrDirName) 
  17. if os.path.isfile(fileOrDirPath): # 如果當前是一個子文件,則直接復制文件 
  18. copyFile(fileOrDirPath, dstDir) 
  19. if os.path.isdir(fileOrDirPath): # 如果當前是一個子目錄,則遞歸復制目錄 
  20. copyDir(fileOrDirPath, os.path.join(dstDir, fileOrDirName)) 
  21. # 拷貝源文件到目標目錄 
  22. def copyFile(srcFile, dstDir): 
  23. if not os.path.isfile(srcFile): 
  24. print(srcFile, "路徑指定的源文件不存在!"
  25. return 
  26. fileName = os.path.basename(srcFile) 
  27. dstFile = os.path.join(dstDir, fileName) 
  28. if os.path.isfile(dstFile): # 有同名的目標文件,則檢查MD5值是否相同,如果不同才Copy 
  29. if calMD5ForFile(srcFile) != calMD5ForFile(dstFile): 
  30. try
  31. shutil.copy(srcFile, dstDir) 
  32. except PermissionError: 
  33. print("PermissionError occurs: ", srcFile) 
  34. else
  35. shutil.copy(srcFile, dstDir) 
  36. if __name__=="__main__"
  37. copyDir("e:/test/src""e:/test/target"

backuper.py:

 

 
  1. # -*- coding: utf-8 -*- 
  2. #!/usr/bin/python 
  3. import os, time 
  4. from file_util import copyDir 
  5. # ------------------------------------------------------------- 
  6. # 定時備份源目錄到目標目錄 
  7. # version = 1.0 
  8. # author = Will 
  9. # ------------------------------------------------------------- 
  10. # 定時備份源目錄到目標目錄,sleepIntervalSeconds為備份時間間隔秒數 
  11. def backupDir(srcDir, dstDir, sleepIntervalSeconds): 
  12. if not os.path.isdir(srcDir): 
  13. print("請指定要備份源目錄并確保目錄存在!"
  14. return
  15. while True: 
  16. print("備份:", srcDir, ",到:", dstDir) 
  17. copyDir(srcDir, dstDir) 
  18. print("開始休眠", sleepIntervalSeconds, "秒..."
  19. time.sleep(sleepIntervalSeconds) 
  20. if __name__=="__main__"
  21. backupDir("d:/Documents/workspace/workspace/griddle""e:/backup/griddle", 20) 

希望本文所述對大家的Python程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镇原县| 宁陵县| 桓台县| 那曲县| 理塘县| 乳山市| 吉林省| 十堰市| 武鸣县| 盘锦市| 乌拉特后旗| 潞西市| 阿尔山市| 准格尔旗| 延吉市| 玛纳斯县| 于田县| 大名县| 云龙县| 甘孜县| 沾化县| 沿河| 樟树市| 兴文县| 石门县| 水富县| 新安县| 哈巴河县| 临洮县| 仁怀市| 屏东市| 东台市| 松潘县| 赫章县| 竹北市| 汝城县| 四子王旗| 安阳市| 栖霞市| 遂平县| 孝感市|