Python 實例: 備份文件

jopen 9年前發布 | 9K 次閱讀 Python Python開發

 它讀取一個任務文件, 根據指定的任務參數自動備份.

 

任務文件的格式: (注意,分號后面注釋是不支持的)

    [task]  ; 一項任務開始  
    dir=h:/Project  ; 指定備份的目錄  
    recusive=1      ; 是否遞歸子目錄  
    suffix=h|cpp|hpp|c|user|filters|vcxproj|sln|css|gif|html|bmp|png|lib|dsw|dsp|htm|html|ico|ini|jpg|rc|vssscc ; 指定備份的擴展名  
    exclude=0   ; 指定是備份上面的參數指定的擴展名還是排除指定的擴展名  
    zip=Project.zip ; 備份后的文件路徑名  

這是python代碼:
# -- coding: utf-8 --
import sys
import os
import zipfile
class Task:

#dir str directory  
#bsub BOOL include subdirectory  
#sfx str postsuffix ,sepeated by '|'  
#ecld BOOL include or execlude the postsuffix sfx  
def __init__(self,dir,bsub,sfx,ecld,zip):  
    self.dir = dir  
    self.bsub = bsub  
    self.suffix = sfx.split("|")  
    self.exclude = ecld  
    self.zip = zip  

@staticmethod  
def isfilter(sfx,sfxs,bexcld):  
    bFound = False  
    for e in sfxs:  
        if e == sfx:  
            bFound = True  
            break         
    if bexcld:  
        return not bFound;  
    else:  
        return bFound;  


class QBackup:
'''''備份指定目錄下具備指定擴展名的文件'''
def init(self):
self._list = []

def __del__(self):  
    pass  

#tfile 任務文件  
def ReadTask(self,tfile):  
    dir = ""  
    bsub = False  
    sfx = ""  
    becld = False  
    zip = ""  
    try:  
        f = open(tfile,'r')  
        while True:  
            line = f.readline()  
            if len(line) == 0:  
                break;  
            line = line.strip(" ")  
            if "[Task]/n".lower() == line.lower():  
                # 讀取接下來的4行  
                iline = 1  
                while iline <= 5:  
                    line = f.readline()  
                    line = line.strip(" /t/n")  # 去除前后的空白符   
                    idx = line.find("=")  
                    if -1 == idx:  
                        break;  
                    atti = line[0:idx]  
                    value = line[idx+1:]  
                    print(value)  
                    if "dir" == atti:  
                        dir = value  
                    elif "recusive" == atti:  
                        bsub = bool(int(value))  
                    elif "suffix" == atti:  
                        sufix = value  
                    elif "exclude" == atti:  
                        becld = bool(int(value))  
                    elif "zip" == atti:  
                        zip = value  
                    else:  
                        break  
                    iline += 1  
                else:  
                    t = Task(dir,bsub,sufix,becld,zip)  
                    self._list.append(t)  
    except:  
        return False  
    return True  


def DoBackup(self):  
    for e in self._list:  
        try:  
            zip = zipfile.ZipFile(e.zip,'w',zipfile.ZIP_DEFLATED)  
            self.ZipDir(zip,e.dir,e.bsub,e.suffix,e.exclude)  
            zip.close()  
        except:  
            print("exception raised!")  
            return False  
    return True       


def ZipDir(self,zip,dir,bsub,sfxs,ecld):  
    subdir = ""  
    path = ""  
    if os.path.isdir(dir):  
        paths = os.listdir(dir)  
        #備份本目錄  
        print("ZipDir: ",dir)  
        for e in paths:  
            path = dir + "/" + e  
            ext = os.path.splitext(e)[1][1:]  
            if os.path.isfile(path) and Task.isfilter(ext,sfxs,ecld):  
                print ("ZipFile: ",path)  
                zip.write(path)  
        #清理子目錄  
        if bsub:      
            for e in paths:  
                subdir = dir + "/" + e  
                self.ZipDir(zip,subdir,bsub,sfxs,ecld)  

def PrintTask(self):  
    for e in self._list:  
        print (e.dir,e.bsub,e.suffix,e.exclude,e.zip)  


if 'main' == name:
c = QBackup()
c.ReadTask("bkup.txt")
c.DoBackup()
</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!