腳本主要用來給游戲客戶端做熱更的。
處理方式就是針對每個文件求其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 是表示獲取當前路徑下這些子目錄的所有文件。可以根據自己項目的情況,自己修改。
