欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2015年07月17日 14:44:10   作者:優(yōu)雅先生  
這篇文章主要介紹了Python實現SVN的目錄周期性備份,實例分析了Python實現SVN周期性備份的原理與實現技巧,具有一定參考借鑒價值,需要的朋友可以參考下

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

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

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

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

md5_caculate.py:

# -*- coding: utf-8 -*-
#!/usr/bin/python
from hashlib import md5
import 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/python
import os,shutil
from 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): # 如果當前是一個子文件,則直接復制文件
      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/python
import os, time
from 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程序設計有所幫助。

相關文章

  • Python Coroutine池化的實現詳解

    Python Coroutine池化的實現詳解

    在當今計算機科學和軟件工程的領域中,池化技術如線程池、連接池和對象池等已經成為優(yōu)化資源利用率和提高軟件性能的重要工具,所以下面我們就來看看Coroutine池化的具體實現吧
    2024-01-01
  • 對比分析BN和dropout在預測和訓練時區(qū)別

    對比分析BN和dropout在預測和訓練時區(qū)別

    這篇文章主要為大家介紹了對比分析BN和dropout在預測和訓練時區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python中的descriptor描述器簡明使用指南

    Python中的descriptor描述器簡明使用指南

    descriptor在Python中主要被用來定義方法和屬性,使用起來相當具有技巧性,這里我們先從基礎的開始,整理一份Python中的descriptor描述器簡明使用指南
    2016-06-06
  • 解決pip install的時候報錯timed out的問題

    解決pip install的時候報錯timed out的問題

    今天小編就為大家分享一篇解決pip install的時候報錯timed out的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • 關于Python中的編碼規(guī)范

    關于Python中的編碼規(guī)范

    這篇文章主要介紹了關于Python中的編碼規(guī)范,一千個程序員有一千套編碼規(guī)范,統一的編碼規(guī)范可以提高開發(fā)效率,需要的朋友可以參考下
    2023-04-04
  • 淺談python中np.array的shape( ,)與( ,1)的區(qū)別

    淺談python中np.array的shape( ,)與( ,1)的區(qū)別

    今天小編就為大家分享一篇python中np.array的shape ( ,)與( ,1)的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python協程用法實例分析

    python協程用法實例分析

    這篇文章主要介紹了python協程用法,實例分析Python中協議的概念、功能及使用方法,需要的朋友可以參考下
    2015-06-06
  • python詞云庫wordcloud的使用方法與實例詳解

    python詞云庫wordcloud的使用方法與實例詳解

    這篇文章主要介紹了python詞云庫wordcloud的使用方法與實例詳解,需要的朋友可以參考下
    2020-02-02
  • python實現時間o(1)的最小棧的實例代碼

    python實現時間o(1)的最小棧的實例代碼

    這篇文章主要介紹了python實現時間o(1)的最小棧的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 使用python如何對圖片進行壓縮

    使用python如何對圖片進行壓縮

    這篇文章主要介紹了使用python如何對圖片進行壓縮,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論