| 
									
										
										
										
											1998-08-10 19:42:37 +00:00
										 |  |  | \section{\module{stat} --- | 
					
						
							| 
									
										
										
										
											1999-03-02 16:37:17 +00:00
										 |  |  |          Interpreting \function{stat()} results} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-03-02 16:37:17 +00:00
										 |  |  | \declaremodule{standard}{stat} | 
					
						
							| 
									
										
										
										
											1998-08-06 21:30:32 +00:00
										 |  |  | \modulesynopsis{Utilities for interpreting the results of | 
					
						
							| 
									
										
										
										
											1999-03-02 16:37:17 +00:00
										 |  |  |   \function{os.stat()}, \function{os.lstat()} and \function{os.fstat()}.} | 
					
						
							|  |  |  | \sectionauthor{Skip Montanaro}{skip@automatrix.com} | 
					
						
							| 
									
										
										
										
											1998-07-23 17:59:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-08-10 19:42:37 +00:00
										 |  |  | The \module{stat} module defines constants and functions for | 
					
						
							| 
									
										
										
										
											1999-04-22 14:55:43 +00:00
										 |  |  | interpreting the results of \function{os.stat()}, | 
					
						
							|  |  |  | \function{os.fstat()} and \function{os.lstat()} (if they exist).  For | 
					
						
							|  |  |  | complete details about the \cfunction{stat()}, \cfunction{fstat()} and | 
					
						
							|  |  |  | \cfunction{lstat()} calls, consult the documentation for your system. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | The \module{stat} module defines the following functions to test for | 
					
						
							|  |  |  | specific file types: | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_ISDIR}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a directory. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_ISCHR}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a character special device file. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-01-29 22:03:41 +00:00
										 |  |  | \begin{funcdesc}{S_ISBLK}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a block special device file. | 
					
						
							| 
									
										
										
										
											1998-01-29 22:03:41 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \begin{funcdesc}{S_ISREG}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a regular file. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_ISFIFO}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a FIFO (named pipe). | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_ISLNK}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a symbolic link. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_ISSOCK}{mode} | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Return non-zero if the mode is from a socket. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-23 20:54:57 +00:00
										 |  |  | Two additional functions are defined for more general manipulation of | 
					
						
							|  |  |  | the file's mode: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_IMODE}{mode} | 
					
						
							|  |  |  | Return the portion of the file's mode that can be set by | 
					
						
							|  |  |  | \function{os.chmod()}---that is, the file's permission bits, plus the | 
					
						
							|  |  |  | sticky bit, set-group-id, and set-user-id bits (on systems that support | 
					
						
							|  |  |  | them). | 
					
						
							|  |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{funcdesc}{S_IFMT}{mode} | 
					
						
							|  |  |  | Return the portion of the file's mode that describes the file type (used | 
					
						
							|  |  |  | by the \function{S_IS*()} functions above). | 
					
						
							|  |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Normally, you would use the \function{os.path.is*()} functions for | 
					
						
							|  |  |  | testing the type of a file; the functions here are useful when you are | 
					
						
							|  |  |  | doing multiple tests of the same file and wish to avoid the overhead of | 
					
						
							|  |  |  | the \cfunction{stat()} system call for each test.  These are also | 
					
						
							|  |  |  | useful when checking for information about a file that isn't handled | 
					
						
							|  |  |  | by \refmodule{os.path}, like the tests for block and character | 
					
						
							|  |  |  | devices. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | All the variables below are simply symbolic indexes into the 10-tuple | 
					
						
							| 
									
										
										
										
											1999-04-22 14:55:43 +00:00
										 |  |  | returned by \function{os.stat()}, \function{os.fstat()} or | 
					
						
							|  |  |  | \function{os.lstat()}. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_MODE} | 
					
						
							|  |  |  | Inode protection mode. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_INO} | 
					
						
							|  |  |  | Inode number. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_DEV} | 
					
						
							|  |  |  | Device inode resides on. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_NLINK} | 
					
						
							|  |  |  | Number of links to the inode. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_UID} | 
					
						
							|  |  |  | User id of the owner. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_GID} | 
					
						
							|  |  |  | Group id of the owner. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_SIZE} | 
					
						
							| 
									
										
										
										
											2001-01-10 19:34:52 +00:00
										 |  |  | Size in bytes of a plain file; amount of data waiting on some special | 
					
						
							|  |  |  | files. | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_ATIME} | 
					
						
							|  |  |  | Time of last access. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_MTIME} | 
					
						
							|  |  |  | Time of last modification. | 
					
						
							|  |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | \begin{datadesc}{ST_CTIME} | 
					
						
							| 
									
										
										
										
											2004-05-12 03:51:40 +00:00
										 |  |  | The ``ctime'' as reported by the operating system.  On some systems | 
					
						
							|  |  |  | (like \UNIX) is the time of the last metadata change, and, on others | 
					
						
							|  |  |  | (like Windows), is the creation time (see platform documentation for | 
					
						
							|  |  |  | details). | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | \end{datadesc} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-01-10 19:34:52 +00:00
										 |  |  | The interpretation of ``file size'' changes according to the file | 
					
						
							|  |  |  | type.  For plain files this is the size of the file in bytes.  For | 
					
						
							| 
									
										
										
										
											2001-11-28 07:26:15 +00:00
										 |  |  | FIFOs and sockets under most flavors of \UNIX{} (including Linux in | 
					
						
							|  |  |  | particular), the ``size'' is the number of bytes waiting to be read at | 
					
						
							|  |  |  | the time of the call to \function{os.stat()}, \function{os.fstat()}, | 
					
						
							|  |  |  | or \function{os.lstat()}; this can sometimes be useful, especially for | 
					
						
							| 
									
										
										
										
											2001-01-11 16:02:08 +00:00
										 |  |  | polling one of these special files after a non-blocking open.  The | 
					
						
							|  |  |  | meaning of the size field for other character and block devices varies | 
					
						
							|  |  |  | more, depending on the implementation of the underlying system call. | 
					
						
							| 
									
										
										
										
											2001-01-10 19:34:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | Example: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1998-02-13 06:58:54 +00:00
										 |  |  | \begin{verbatim} | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | import os, sys | 
					
						
							|  |  |  | from stat import * | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-19 18:10:37 +00:00
										 |  |  | def walktree(top, callback): | 
					
						
							|  |  |  |     '''recursively descend the directory tree rooted at top, | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  |        calling the callback function for each regular file''' | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-06-19 18:10:37 +00:00
										 |  |  |     for f in os.listdir(top): | 
					
						
							|  |  |  |         pathname = os.path.join(top, f) | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  |         mode = os.stat(pathname)[ST_MODE] | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  |         if S_ISDIR(mode): | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  |             # It's a directory, recurse into it | 
					
						
							|  |  |  |             walktree(pathname, callback) | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  |         elif S_ISREG(mode): | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  |             # It's a file, call the callback function | 
					
						
							|  |  |  |             callback(pathname) | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  |             # Unknown file type, print a message | 
					
						
							|  |  |  |             print 'Skipping %s' % pathname
 | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  | def visitfile(file): | 
					
						
							|  |  |  |     print 'visiting', file | 
					
						
							| 
									
										
										
										
											1996-12-19 22:39:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1999-04-05 19:26:16 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											1999-08-03 21:52:29 +00:00
										 |  |  |     walktree(sys.argv[1], visitfile) | 
					
						
							| 
									
										
										
										
											1998-02-13 06:58:54 +00:00
										 |  |  | \end{verbatim} |