2013-08-22 11:49:34 +08:00
#!/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 ) ] ) :
2013-10-30 16:43:19 +08:00
if self . samefile ( dir , curDir [ : len ( dir ) ] ) :
2013-08-22 11:49:34 +08:00
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 ) ) :
2013-10-30 16:43:19 +08:00
if self . samefile ( realFilePath , os . path . join ( self . __root , file ) ) :
2013-08-22 11:49:34 +08:00
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 ) ) ]
2013-10-30 16:43:19 +08:00
def samefile ( self , path1 , path2 ) :
return os . stat ( path1 ) == os . stat ( path2 )
2013-08-22 11:49:34 +08:00
def set_root ( self , root ) :
" set the root path "
self . _root = root
2013-08-22 13:40:57 +08:00
def find_files ( self , pathes , suffixes = ( ) , exclude = ( ) ) :
2013-08-22 11:49:34 +08:00
" 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