python解析assetbundle文件_skybeauty_新浪博客

 
 
# -*- coding: utf-8 -*-
Date = 2016 / 11 / 29;
__author = "Author"
import os;
import sys;
import re;
import subprocess;
import filecmp;
import shutil;

import difflib
reload(sys)

sys.setdefaultencoding("utf8")

curFilePath = os.path.abspath(__file__)
curDir = os.path.dirname(curFilePath)

outDir = os.path.join(curDir,"temp")

#要过滤的文件前缀
expect_prefix = ["MonoScript","AssetBundle"]

#要处理的文件后缀
suffix=".ab"

#要忽略的后缀
expect_suffix=[".pvr"]

outLogFile = os.path.join(curDir,"log.txt")

logList=[];


def do_log(text):
logList.append(text +"\n");

#解压ab文件
def extract_ab(filePath,suffix):

fileName = os.path.splitext(os.path.basename(filePath))[0]+"_"+suffix
output = os.path.join(outDir,fileName)
cmd=["mono"]
cmd.append("abexport")
cmd.append("--dump")
cmd.append(filePath)
cmd.append(output)
subprocess.check_output(cmd);
files = []
get_files(output,expect_prefix,files)
return files,output


#检测是否在数组中
def check_in_list(item,fList,to_dir):
isIn = False;
value = None;
for i in fList:
fileName=i.replace(to_dir,"")
if item == fileName:
isIn = True;
value = i;
break
return isIn,value

#比较两个数组
def compare_array(from_files,to_files,from_dir,to_dir):
result = len(from_files) == len(to_files);
if result:
for i in from_files:
fileName = i.replace(from_dir,"")
if not check_in_list(fileName,to_files,to_dir):
result = False;
break
else:
pass
return result

#对比文件是否相同
def compare_file(from_file,to_file):
result = filecmp.cmp(from_file,to_file,0);
if not result:
from_files,from_dir = extract_ab(from_file,"from");
to_files ,to_dir= extract_ab(to_file,"to");

if compare_array(from_files,to_files,from_dir,to_dir):
result = True;
for f_file in from_files:
fileName =f_file.replace(from_dir,"")
isIn,t_file = check_in_list(fileName,to_files,to_dir)
if isIn:
if not filecmp.cmp(f_file,t_file):
do_log("存在不相同的文件::\n%s\n%s"%(f_file,t_file))
result = False
break
else:
do_log("目标不在的文件:\n%s\n%s\n%s"%(fileName,f_file,t_file))

return result;

#是否包含前缀
def checkHasPrefix(item,preifx=[]):
isHas = False;
for i in preifx:
if item.startswith(i):
isHas = True;
break
return isHas

#是否包含后缀
def checkHasSuffix(item,suffix=[]):
isHas = False;
for i in suffix:
if item.endswith(i):
isHas = True;
break
return isHas

#获取文件夹下某个后缀的所有文件
def get_files(dirPath,noPrefix=[],fileList=[]):
tempList = os.listdir(dirPath)
for item in tempList:
if not checkHasPrefix(item,noPrefix) and not checkHasSuffix(item,expect_suffix) :
filePath = os.path.join(dirPath,item)
if os.path.isfile(filePath):
fileList.append(filePath)
elif os.path.isdir(filePath):
get_files(filePath,noPrefix,fileList)
return fileList




if __name__ == '__main__':

fromDir = os.path.join(curDir,"from")
toDir = os.path.join(curDir,"to")

if os.path.exists(outDir):
shutil.rmtree(outDir);

os.mkdir(outDir);
fromList = os.listdir(fromDir)

for item in fromList:
if item.endswith(suffix):
fromFilePath = os.path.join(fromDir,item)
toFilePath = os.path.join(toDir,item)
isCopy = False;
if os.path.exists(toFilePath):
if not compare_file(fromFilePath,toFilePath):
isCopy = True
else:
isCopy = True
# if isCopy:
# print("copy---success----%s----->%s"%(fromFilePath,toFilePath))
# #shutil.copyfile(fromFilePath, toFilePath)
# else:
# print("isSame------%s------>%s"%(fromFilePath,toFilePath))
wFile = open(outLogFile,"w");
wFile.writelines(logList);
wFile.close();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值