1 """ 2 Path operations common to more than one OS 3 Do not use directly. The OS specific modules import the appropriate 4 functions from this module themselves. 5 """ 6 import os 7 import stat 8 9 __all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', 10 'getsize', 'isdir', 'isfile'] 11 12 13 # Does a path exist? 14 # This is false for dangling symbolic links on systems that support them. 15 def exists(path): 16 """Test whether a path exists. Returns False for broken symbolic links""" 17 try: 18 os.stat(path) 19 except os.error: 20 return False 21 return True 22 23 24 # This follows symbolic links, so both islink() and isdir() can be true 25 # for the same path ono systems that support symlinks 26 def isfile(path): 27 """Test whether a path is a regular file""" 28 try: 29 st = os.stat(path) 30 except os.error: 31 return False 32 return stat.S_ISREG(st.st_mode) 33 34 35 # Is a path a directory? 36 # This follows symbolic links, so both islink() and isdir() 37 # can be true for the same path on systems that support symlinks 38 def isdir(s): 39 """Return true if the pathname refers to an existing directory.""" 40 try: 41 st = os.stat(s) 42 except os.error: 43 return False 44 return stat.S_ISDIR(st.st_mode) 45 46 47 def getsize(filename): 48 """Return the size of a file, reported by os.stat().""" 49 return os.stat(filename).st_size 50 51 52 def getmtime(filename): 53 """Return the last modification time of a file, reported by os.stat().""" 54 return os.stat(filename).st_mtime 55 56 57 def getatime(filename): 58 """Return the last access time of a file, reported by os.stat().""" 59 return os.stat(filename).st_atime 60 61 62 def getctime(filename): 63 """Return the metadata change time of a file, reported by os.stat().""" 64 return os.stat(filename).st_ctime 65 66 67 # Return the longest prefix of all list elements. 68 def commonprefix(m): 69 "Given a list of pathnames, returns the longest common leading component" 70 if not m: return '' 71 s1 = min(m) 72 s2 = max(m) 73 for i, c in enumerate(s1): 74 if c != s2[i]: 75 return s1[:i] 76 return s1 77 78 # Split a path in root and extension. 79 # The extension is everything starting at the last dot in the last 80 # pathname component; the root is everything before that. 81 # It is always true that root + ext == p. 82 83 # Generic implementation of splitext, to be parametrized with 84 # the separators 85 def _splitext(p, sep, altsep, extsep): 86 """Split the extension from a pathname. 87 88 Extension is everything from the last dot to the end, ignoring 89 leading dots. Returns "(root, ext)"; ext may be empty.""" 90 91 sepIndex = p.rfind(sep) 92 if altsep: 93 altsepIndex = p.rfind(altsep) 94 sepIndex = max(sepIndex, altsepIndex) 95 96 dotIndex = p.rfind(extsep) 97 if dotIndex > sepIndex: 98 # skip all leading dots 99 filenameIndex = sepIndex + 1 100 while filenameIndex < dotIndex: 101 if p[filenameIndex] != extsep: 102 return p[:dotIndex], p[dotIndex:] 103 filenameIndex += 1 104 105 return p, '' 106