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

首頁 > 編程 > Python > 正文

Python實現(xiàn)SVN的目錄周期性備份實例

2019-11-25 17:10:24
字體:
供稿:網(wǎng)友

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

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

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

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

md5_caculate.py:

# -*- coding: utf-8 -*-#!/usr/bin/pythonfrom hashlib import md5import os def calMD5(str):  m = md5()  m.update(str)  return m.hexdigest()def calMD5ForFile(file):  statinfo = os.stat(file)  if int(statinfo.st_size) / (1024*1024) >= 1000:#     print("File size > 1000, move to big file...")    return calMD5ForBigFile(file)  m = md5()  f = open(file, 'rb')  m.update(f.read())  f.close()  return m.hexdigest()def calMD5ForFolder(dir, MD5File):  outfile = open(MD5File,'w')  for root, subdirs, files in os.walk(dir):    for file in files:      filefullpath = os.path.join(root, file)      """print filefullpath"""      filerelpath = os.path.relpath(filefullpath, dir)      md5 = calMD5ForFile(filefullpath)      outfile.write(filerelpath+' '+md5+"/n")  outfile.close()def calMD5ForBigFile(file):  m = md5()  f = open(file, 'rb')  buffer = 8192  # why is 8192 | 8192 is fast than 2048  while 1:    chunk = f.read(buffer)    if not chunk : break    m.update(chunk)  f.close()  return m.hexdigest()if __name__=="__main__":  print(calMD5ForFile("e:/test/target/a/b/rabbit.txt"))

file_util.py:

# -*- coding: utf-8 -*-#!/usr/bin/pythonimport os,shutilfrom md5_caculate import calMD5ForFile# 拷貝源目錄到目標目錄def copyDir(srcDir, dstDir):  if srcDir in dstDir: # 源目錄包含在目標目錄,則直接返回    return  if not os.path.isdir(srcDir):    print(srcDir, "路徑指定的源目錄不存在!")    return;  if not os.path.exists(dstDir): # 目標目錄不存在時則創(chuàng)建    os.makedirs(dstDir)  for fileOrDirName in os.listdir(srcDir): # 源目錄下的所有文件(包括文件和目錄) TODO BUG:如果srcDir為一個空目錄?#     fileOrDirPath = srcDir + "/" + fileOrDirName    fileOrDirPath = os.path.join(srcDir, fileOrDirName)    if os.path.isfile(fileOrDirPath): # 如果當(dāng)前是一個子文件,則直接復(fù)制文件      copyFile(fileOrDirPath, dstDir)    if os.path.isdir(fileOrDirPath): # 如果當(dāng)前是一個子目錄,則遞歸復(fù)制目錄      copyDir(fileOrDirPath, os.path.join(dstDir, fileOrDirName))# 拷貝源文件到目標目錄def copyFile(srcFile, dstDir):  if not os.path.isfile(srcFile):    print(srcFile, "路徑指定的源文件不存在!")    return  fileName = os.path.basename(srcFile)  dstFile = os.path.join(dstDir, fileName)  if os.path.isfile(dstFile): # 有同名的目標文件,則檢查MD5值是否相同,如果不同才Copy    if calMD5ForFile(srcFile) != calMD5ForFile(dstFile):      try:        shutil.copy(srcFile, dstDir)      except PermissionError:        print("PermissionError occurs: ", srcFile)  else:    shutil.copy(srcFile, dstDir)if __name__=="__main__":  copyDir("e:/test/src", "e:/test/target")

backuper.py:

# -*- coding: utf-8 -*-#!/usr/bin/pythonimport os, timefrom file_util import copyDir# -------------------------------------------------------------# 定時備份源目錄到目標目錄# version = 1.0# author = Will# -------------------------------------------------------------# 定時備份源目錄到目標目錄,sleepIntervalSeconds為備份時間間隔秒數(shù)def backupDir(srcDir, dstDir, sleepIntervalSeconds):  if not os.path.isdir(srcDir):    print("請指定要備份源目錄并確保目錄存在!")    return;  while True:    print("備份:", srcDir, ",到:", dstDir)    copyDir(srcDir, dstDir)    print("開始休眠", sleepIntervalSeconds, "秒...")    time.sleep(sleepIntervalSeconds)if __name__=="__main__":  backupDir("d:/Documents/workspace/workspace/griddle", "e:/backup/griddle", 20)

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 溆浦县| 英山县| 绵阳市| 伊金霍洛旗| 张掖市| 拉萨市| 永济市| 连平县| 九龙县| 焉耆| 抚宁县| 曲沃县| 磴口县| 米林县| 中卫市| 通渭县| 怀集县| 北川| 桃园县| 洪雅县| 龙口市| 阳曲县| 贵阳市| 青冈县| 德昌县| 北安市| 深水埗区| 恩平市| 贡觉县| 玉龙| 高台县| 静宁县| 彭阳县| 大方县| 郁南县| 谷城县| 苏尼特右旗| 巴彦淖尔市| 梅州市| 宜兰县| 霍邱县|