| 
									
										
										
										
											2006-09-05 02:22:17 +00:00
										 |  |  | """
 | 
					
						
							|  |  |  | 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) | 
					
						
							| 
									
										
										
										
											2007-05-14 20:52:31 +00:00
										 |  |  |     for i, c in enumerate(s1): | 
					
						
							|  |  |  |         if c != s2[i]: | 
					
						
							| 
									
										
										
										
											2006-09-05 02:22:17 +00:00
										 |  |  |             return s1[:i] | 
					
						
							| 
									
										
										
										
											2007-05-14 20:52:31 +00:00
										 |  |  |     return s1 | 
					
						
							| 
									
										
										
										
											2007-03-07 11:04:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # 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): | 
					
						
							| 
									
										
										
										
											2007-03-12 18:07:52 +00:00
										 |  |  |     """Split the extension from a pathname.
 | 
					
						
							| 
									
										
										
										
											2007-03-07 11:04:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     Extension is everything from the last dot to the end, ignoring | 
					
						
							|  |  |  |     leading dots.  Returns "(root, ext)"; ext may be empty."""
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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] != extsep: | 
					
						
							|  |  |  |                 return p[:dotIndex], p[dotIndex:] | 
					
						
							|  |  |  |             filenameIndex += 1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return p, '' |