正文  软件开发 > 编程综合 >

Python 实例: 备份文件

它读取一个任务文件, 根据指定的任务参数自动备份. 任务文件的格式: (注意,分号后面注释是不支持的) [task] ; 一项任务开始 dir=h:/...

它读取一个任务文件, 根据指定的任务参数自动备份.

任务文件的格式: (注意,分号后面注释是不支持的)

    [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()