mirror of https://github.com/axmolengine/axmol.git
87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
#!/usr/bin.python
|
|
''' some common path and file operation '''
|
|
import os.path
|
|
import re
|
|
import types
|
|
import fileinput
|
|
import cStringIO
|
|
|
|
|
|
class PathUtils:
|
|
|
|
def __init__(self, root):
|
|
self.__root = root
|
|
|
|
def __check_file_matchs(self, filePath):
|
|
|
|
#normalize the path
|
|
realFilePath = os.path.abspath(filePath)
|
|
|
|
if not os.path.isfile(realFilePath):
|
|
return False
|
|
|
|
curDir, fileName = os.path.split(realFilePath)
|
|
|
|
# check dir is exclude or not
|
|
for dir in self.__exclude:
|
|
dir = os.path.abspath(os.path.join(self.__root, dir))
|
|
if os.path.isdir(dir) and os.path.isdir(curDir[:len(dir)]):
|
|
if os.path.samefile(dir, curDir[:len(dir)]):
|
|
return False
|
|
|
|
if self.__rep.match(fileName):
|
|
# check file is exclude or not
|
|
for file in self.__exclude:
|
|
if os.path.isfile(os.path.join(self.__root, file)):
|
|
if os.path.samefile(realFilePath, os.path.join(self.__root, file)):
|
|
return False
|
|
|
|
return True
|
|
|
|
return False
|
|
|
|
|
|
def __walk_collect_files(self, lst, dirname, names):
|
|
for name in names:
|
|
if self.__check_file_matchs(os.path.join(dirname, name)):
|
|
if type(lst) is types.ListType:
|
|
lst += [os.path.abspath(os.path.join(dirname, name))]
|
|
|
|
def set_root(self, root):
|
|
"set the root path"
|
|
self._root = root
|
|
|
|
def find_files(self, pathes, suffixes = (), exclude = ()):
|
|
"find files in pathes(a list) with suffixes. It will not collect files your specified in exclude. all of these pathes passed in must be relative to root"
|
|
lst = []
|
|
|
|
# rep generate with params to search the files
|
|
repStr = cStringIO.StringIO()
|
|
repStr.write(".+")
|
|
for i, suffix in enumerate(suffixes):
|
|
if i == 0:
|
|
repStr.write("\.(?:(?:")
|
|
else:
|
|
repStr.write("|(?:")
|
|
|
|
repStr.write(suffix)
|
|
|
|
if i == len(suffixes) - 1:
|
|
repStr.write("))$")
|
|
else:
|
|
repStr.write(")")
|
|
|
|
self.__rep = re.compile(repStr.getvalue())
|
|
repStr.close()
|
|
self.__exclude = exclude
|
|
|
|
# find files
|
|
for path in pathes:
|
|
path = os.path.join(self.__root, path)
|
|
if os.path.isdir(path):
|
|
os.path.walk(path, self.__walk_collect_files, lst)
|
|
else:
|
|
lst += [os.path.abspath(path)]
|
|
|
|
return lst
|