一個python的文件對比腳本


腳本主要用來給游戲客戶端做熱更的。

處理方式就是針對每個文件求其MD5值,再根據文件的目錄和名字對比兩個版本的MD5值,如果不一樣,則這次熱更就需要更新這個文件。

用法很簡單。

1,生成MD5碼列表

參數有-i,針對某個目錄下的指定路徑下的所有文件生成MD5的列表。-v 當前版本號多少

2,對比兩個路徑的文件,並且將不同MD5的文件輸出到指定路徑下。

參數有-l,-r,-o.

-l就是左邊的文件,為比較舊版本的目錄。

-r就是右邊的文件,為最新版本的目錄。

-o就是不同文件的輸出目錄。

對比會優先查找左邊文件夾下是否有.md5,如果有的話,會優先使用文件里的md5記錄。

import sys, getopt
import os
import os.path
import hashlib
import shutil

searchFolders = ["\\src\\", "\\res\\"]

def usage():
    print "this is useage"

def getmd5(filename, parentName, folderName):  
    m = hashlib.md5()  
    mfile = open(filename, 'rb')
    m.update(mfile.read())
    mfile.close()
    md5value = m.hexdigest()

    #get last part of file name
    subStr = filename[len(parentName) - len(folderName):len(filename)]
    return md5value+"\t"+ subStr

def getCurDir():
     path = sys.path[0]
     if os.path.isdir(path):
         return path
     elif os.path.isfile(path):
         return os.path.dirname(path)


def saveFile(str, ver):
    f = open(getCurDir() + "/" + ver + ".md5", 'w')
    f.write(str)
    f.close()

def getDescOfUrl(url):
    saveStr = ""
    descList = []
    index = 0
    for parent,dirnames,filenames in os.walk(url):
        for filename in filenames:
            for i, val in enumerate(searchFolders):
                targParent = url + val
                if targParent in parent:
                    fullPath = os.path.join(parent, filename)
                    md5 = getmd5(fullPath, targParent, val)
                    #print "file is: " + md5
                    saveStr = saveStr + md5 + "\n"
                    descList.append(md5)

    return saveStr, descList

def onIArg(url, ver):
    saveStr, descList = getDescOfUrl(url)
    saveFile(saveStr, ver)

def getDicByFile(url):
    file = open(url)
    line = f.readline()
    retDic = {}
    while line:
        md5, filename = line.split("\t")
        retDic[filename] = md5

    return retDic

def getDicByUrl(url):
    saveStr, splitArr = getDescOfUrl(url)
    retDic = {}

    for value in splitArr:
        md5, filename = value.split("\t")
        retDic[filename] = md5

    return retDic

def getDicOfUrl(url):
    fileList = os.listdir(url)
    version = ""
    for value in fileList:
        if os.path.splitext(value)[1] == '.md5':
            version = os.path.splitext(value)[0]
            break

    if version != "":
        return getDicByFile(url + "/" + version + ".md5")
    else:
        return getDicByUrl(url)


opts,args = getopt.getopt(sys.argv[1:], "hi:l:r:v:o:")

inputFile = ""
leftFile = ""
rightFile = ""
outFile = ""
version = ""
showHelp = False

for op, value in opts:
    if op == "-i":
        inputFile = value
    elif op == "-v":
        version = value
    elif op == "-l":
        leftFile = value
    elif op == "-r":
        rightFile = value
    elif op == "-o":
        outFile = value
    elif op == "-h":
        showHelp = True


if showHelp:
    usage()
    sys.exit()
elif inputFile != "":

    if version == "":
        print "you must input the version value using -v"
        sys.exit()

    onIArg(inputFile, version)
elif leftFile != "":
    if rightFile == "":
        print "you must input the right file url using -r"
        sys.exit()
    elif outFile == "":
        print "you must input the out direct using -o"
        sys.exit()
    else:
        print "on diff .."
        diffDic = {}
        leftDic = getDicOfUrl(leftFile)
        rightDic = getDicOfUrl(rightFile)
        for (filename, md5) in rightDic.items():
            if not leftDic.has_key(filename):
                diffDic[filename] = True
            elif leftDic.get(filename) != md5:
                diffDic[filename] = True

        for (filename, val) in diffDic.items():
            #if the folder exit
            inUrl = rightFile + filename
            outUrl = outFile + filename
            folderIndex = outUrl.rfind("\\")

            outFolder = outUrl[0:folderIndex]

            if not os.path.isdir(outFolder):
                os.makedirs(outFolder)
                
            print("copy from " + rightFile + filename)
            print("to " + outUrl)

            shutil.copy(inUrl, outUrl)
                

        

 

腳本里的

searchFolders 是表示獲取當前路徑下這些子目錄的所有文件。可以根據自己項目的情況,自己修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM