Python实现SVN的目录周期性备份实例
本文实例讲述了Python实现SVN的目录周期性备份方法。分享给大家供大家参考。具体如下:
起因:今天用SVN时,不小心把远程SVN服务器上的目录删掉了,然后在本地又手贱地还原了一下项目(eclipse中右键项目team => 还原),导致写了大半天的代码全部丢失,用多款数据恢复软件恢复也无果。一怒之下写了这个目录周期性备份小工具,每隔5秒备份源目录中的所有文件到目标目录(保留结构),保证目标目录中的文件只增不减。且每次只拷贝发生变化的文件(比较两个文件的MD5值)。
思考:虽然SVN也是一个版本管理软件,但在使用过程总觉得它的诸多操作挺别扭,相比而言Git更强大灵活。我自己理想中的版本控制软件至少应该考虑到一些让用户产生较强挫败的使用场景(也许大部分情况是因为用户误用,但如果误用情况也能考虑到,才能更体现软件的终极人文关怀嘛),比如删除远程服务器上的文件,我觉得应该设计成这样:即使用户删除了文件,文件还应该在一个缓冲区中呆1天(或几个小时,可以配置),然后由一个定时任务定时删除缓冲区中停留时间超过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): # 目标目录不存在时则创建 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程序设计有所帮助。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



PS "Memuatkan" Masalah disebabkan oleh akses sumber atau masalah pemprosesan: Kelajuan bacaan cakera keras adalah perlahan atau buruk: Gunakan CrystaldiskInfo untuk memeriksa kesihatan cakera keras dan menggantikan cakera keras yang bermasalah. Memori yang tidak mencukupi: Meningkatkan memori untuk memenuhi keperluan PS untuk imej resolusi tinggi dan pemprosesan lapisan kompleks. Pemandu kad grafik sudah lapuk atau rosak: Kemas kini pemandu untuk mengoptimumkan komunikasi antara PS dan kad grafik. Laluan fail terlalu panjang atau nama fail mempunyai aksara khas: Gunakan laluan pendek dan elakkan aksara khas. Masalah PS sendiri: Pasang semula atau membaiki pemasang PS.

PS yang tersangkut pada "memuatkan" apabila boot boleh disebabkan oleh pelbagai sebab: Lumpuhkan plugin yang korup atau bercanggah. Padam atau namakan semula fail konfigurasi yang rosak. Tutup program yang tidak perlu atau menaik taraf memori untuk mengelakkan memori yang tidak mencukupi. Naik taraf ke pemacu keadaan pepejal untuk mempercepatkan bacaan cakera keras. Pasang semula PS untuk membaiki fail sistem rasuah atau isu pakej pemasangan. Lihat maklumat ralat semasa proses permulaan analisis log ralat.

Menyelesaikan masalah Permulaan Photoshop Perlahan memerlukan pendekatan berbilang arah, termasuk: menaik taraf perkakasan (memori, pemacu keadaan pepejal, CPU); menyahpasang pemalam yang sudah lapuk atau tidak serasi; membersihkan sampah sistem dan program latar belakang yang berlebihan dengan kerap; menutup program yang tidak relevan dengan berhati -hati; Mengelakkan membuka sejumlah besar fail semasa permulaan.

"Memuatkan" gagap berlaku apabila membuka fail pada PS. Sebab-sebabnya mungkin termasuk: fail yang terlalu besar atau rosak, memori yang tidak mencukupi, kelajuan cakera keras perlahan, masalah pemacu kad grafik, versi PS atau konflik plug-in. Penyelesaiannya ialah: Semak saiz fail dan integriti, tingkatkan memori, menaik taraf cakera keras, mengemas kini pemacu kad grafik, menyahpasang atau melumpuhkan pemalam yang mencurigakan, dan memasang semula PS. Masalah ini dapat diselesaikan dengan berkesan dengan memeriksa secara beransur -ansur dan memanfaatkan tetapan prestasi PS yang baik dan membangunkan tabiat pengurusan fail yang baik.

Alasan pemuatan PS yang perlahan adalah kesan gabungan perkakasan (CPU, memori, cakera keras, kad grafik) dan perisian (sistem, program latar belakang). Penyelesaian termasuk: Menaik taraf perkakasan (terutamanya menggantikan pemacu keadaan pepejal), mengoptimumkan perisian (membersihkan sampah sistem, mengemas kini pemacu, menyemak tetapan PS), dan memproses fail PS. Penyelenggaraan komputer yang kerap juga boleh membantu meningkatkan kelajuan berjalan PS.

Kad PS adalah "Memuatkan"? Penyelesaian termasuk: Memeriksa konfigurasi komputer (memori, cakera keras, pemproses), membersihkan pemecahan cakera keras, mengemas kini pemacu kad grafik, menyesuaikan tetapan PS, memasang semula PS, dan membangunkan tabiat pengaturcaraan yang baik.

Terdapat tiga cara untuk mengeksport PDF dalam kelompok pada PS: Gunakan fungsi tindakan PS: Rekod dan buka fail dan eksport tindakan PDF, dan laksanakan tindakan dalam gelung. Dengan bantuan perisian pihak ketiga: Gunakan perisian pengurusan fail atau alat automasi untuk menentukan folder input dan output dan tetapkan format nama fail. Gunakan skrip: Tulis skrip untuk menyesuaikan logik eksport batch, tetapi pengetahuan pengaturcaraan diperlukan.

Kunci kawalan bulu adalah memahami sifatnya secara beransur -ansur. PS sendiri tidak menyediakan pilihan untuk mengawal lengkung kecerunan secara langsung, tetapi anda boleh melaraskan radius dan kelembutan kecerunan dengan pelbagai bulu, topeng yang sepadan, dan pilihan halus untuk mencapai kesan peralihan semula jadi.
