| """ | 
 | Path operations common to more than one OS | 
 | Do not use directly.  The OS specific modules import the appropriate | 
 | functions from this module themselves. | 
 | """ | 
 | import os | 
 | import stat | 
 |  | 
 | __all__ = ['commonprefix', 'exists', 'getatime', 'getctime', 'getmtime', | 
 |            'getsize', 'isdir', 'isfile'] | 
 |  | 
 |  | 
 | # Does a path exist? | 
 | # This is false for dangling symbolic links on systems that support them. | 
 | def exists(path): | 
 |     """Test whether a path exists.  Returns False for broken symbolic links""" | 
 |     try: | 
 |         st = os.stat(path) | 
 |     except os.error: | 
 |         return False | 
 |     return True | 
 |  | 
 |  | 
 | # This follows symbolic links, so both islink() and isdir() can be true | 
 | # for the same path ono systems that support symlinks | 
 | def isfile(path): | 
 |     """Test whether a path is a regular file""" | 
 |     try: | 
 |         st = os.stat(path) | 
 |     except os.error: | 
 |         return False | 
 |     return stat.S_ISREG(st.st_mode) | 
 |  | 
 |  | 
 | # Is a path a directory? | 
 | # This follows symbolic links, so both islink() and isdir() | 
 | # can be true for the same path on systems that support symlinks | 
 | def isdir(s): | 
 |     """Return true if the pathname refers to an existing directory.""" | 
 |     try: | 
 |         st = os.stat(s) | 
 |     except os.error: | 
 |         return False | 
 |     return stat.S_ISDIR(st.st_mode) | 
 |  | 
 |  | 
 | def getsize(filename): | 
 |     """Return the size of a file, reported by os.stat().""" | 
 |     return os.stat(filename).st_size | 
 |  | 
 |  | 
 | def getmtime(filename): | 
 |     """Return the last modification time of a file, reported by os.stat().""" | 
 |     return os.stat(filename).st_mtime | 
 |  | 
 |  | 
 | def getatime(filename): | 
 |     """Return the last access time of a file, reported by os.stat().""" | 
 |     return os.stat(filename).st_atime | 
 |  | 
 |  | 
 | def getctime(filename): | 
 |     """Return the metadata change time of a file, reported by os.stat().""" | 
 |     return os.stat(filename).st_ctime | 
 |  | 
 |  | 
 | # Return the longest prefix of all list elements. | 
 | def commonprefix(m): | 
 |     "Given a list of pathnames, returns the longest common leading component" | 
 |     if not m: return '' | 
 |     s1 = min(m) | 
 |     s2 = max(m) | 
 |     for i, c in enumerate(s1): | 
 |         if c != s2[i]: | 
 |             return s1[:i] | 
 |     return s1 | 
 |  | 
 | # Split a path in root and extension. | 
 | # The extension is everything starting at the last dot in the last | 
 | # pathname component; the root is everything before that. | 
 | # It is always true that root + ext == p. | 
 |  | 
 | # Generic implementation of splitext, to be parametrized with | 
 | # the separators | 
 | def _splitext(p, sep, altsep, extsep): | 
 |     """Split the extension from a pathname. | 
 |  | 
 |     Extension is everything from the last dot to the end, ignoring | 
 |     leading dots.  Returns "(root, ext)"; ext may be empty.""" | 
 |     # NOTE: This code must work for text and bytes strings. | 
 |  | 
 |     sepIndex = p.rfind(sep) | 
 |     if altsep: | 
 |         altsepIndex = p.rfind(altsep) | 
 |         sepIndex = max(sepIndex, altsepIndex) | 
 |  | 
 |     dotIndex = p.rfind(extsep) | 
 |     if dotIndex > sepIndex: | 
 |         # skip all leading dots | 
 |         filenameIndex = sepIndex + 1 | 
 |         while filenameIndex < dotIndex: | 
 |             if p[filenameIndex:filenameIndex+1] != extsep: | 
 |                 return p[:dotIndex], p[dotIndex:] | 
 |             filenameIndex += 1 | 
 |  | 
 |     return p, p[:0] |