香港云主机最佳企业级服务商!

ADSL拨号VPS包含了中国大陆(联通,移动,电信,)

中国香港,国外拨号VPS。

当前位置:云主机 > python >

电信ADSL拨号VPS
联通ADSL拨号VPS
移动ADSL拨号VPS

Python实现SVN的目录周期性备份实例


时间:2021-12-08 14:54 作者:admin610456


本文实例讲述了python/' target='_blank'>python实现SVN的目录周期性备份方法。分享给大家供大家参考。具体如下:

起因:今天用SVN时,不小心把远程SVN服务器上的目录删掉了,然后在本地又手贱地还原了一下项目(eclipse中右键项目team => 还原),导致写了大半天的代码全部丢失,用多款数据恢复软件恢复也无果。一怒之下写了这个目录周期性备份小工具,每隔5秒备份源目录中的所有文件到目标目录(保留结构),保证目标目录中的文件只增不减。且每次只拷贝发生变化的文件(比较两个文件的MD5值)。

思考:虽然SVN也是一个版本管理软件,但在使用过程总觉得它的诸多操作挺别扭,相比而言Git更强大灵活。我自己理想中的版本控制软件至少应该考虑到一些让用户产生较强挫败的使用场景(也许大部分情况是因为用户误用,但如果误用情况也能考虑到,才能更体现软件的终极人文关怀嘛),比如删除远程服务器上的文件,我觉得应该设计成这样:即使用户删除了文件,文件还应该在一个缓冲区中呆1天(或几个小时,可以配置),然后由一个定时任务定时删除缓冲区中停留时间超过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): # 目标目录不存在时则创建    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): # 如果当前是一个子文件,则直接复制文件      copyFile(fileOrDirPath, dstDir)    if os.path.isdir(fileOrDirPath): # 如果当前是一个子目录,则递归复制目录      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为备份时间间隔秒数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程序设计有所帮助。

(责任编辑:admin)






帮助中心
会员注册
找回密码
新闻中心
快捷通道
域名登录面板
虚机登录面板
云主机登录面板
关于我们
关于我们
联系我们
联系方式

售前咨询:17830004266(重庆移动)

企业QQ:383546523

《中华人民共和国工业和信息化部》 编号:ICP备00012341号

Copyright © 2002 -2018 香港云主机 版权所有
声明:香港云主机品牌标志、品牌吉祥物均已注册商标,版权所有,窃用必究

云官方微信

在线客服

  • 企业QQ: 点击这里给我发消息
  • 技术支持:383546523

  • 公司总台电话:17830004266(重庆移动)
  • 售前咨询热线:17830004266(重庆移动)