1998-08-11 03:42:37 +08:00
|
|
|
\section{\module{stat} ---
|
1999-03-03 00:37:17 +08:00
|
|
|
Interpreting \function{stat()} results}
|
1998-07-24 01:59:49 +08:00
|
|
|
|
1999-03-03 00:37:17 +08:00
|
|
|
\declaremodule{standard}{stat}
|
1998-08-07 05:30:32 +08:00
|
|
|
\modulesynopsis{Utilities for interpreting the results of
|
1999-03-03 00:37:17 +08:00
|
|
|
\function{os.stat()}, \function{os.lstat()} and \function{os.fstat()}.}
|
|
|
|
\sectionauthor{Skip Montanaro}{skip@automatrix.com}
|
1998-07-24 01:59:49 +08:00
|
|
|
|
1996-12-20 06:39:22 +08:00
|
|
|
|
1998-08-11 03:42:37 +08:00
|
|
|
The \module{stat} module defines constants and functions for
|
1999-04-22 22:55:43 +08: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-20 06:39:22 +08:00
|
|
|
|
1999-04-24 04:54:57 +08:00
|
|
|
The \module{stat} module defines the following functions to test for
|
|
|
|
specific file types:
|
1996-12-20 06:39:22 +08:00
|
|
|
|
|
|
|
|
|
|
|
\begin{funcdesc}{S_ISDIR}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a directory.
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{S_ISCHR}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a character special device file.
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
1998-01-30 06:03:41 +08:00
|
|
|
\begin{funcdesc}{S_ISBLK}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a block special device file.
|
1998-01-30 06:03:41 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
1996-12-20 06:39:22 +08:00
|
|
|
\begin{funcdesc}{S_ISREG}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a regular file.
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{S_ISFIFO}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a FIFO (named pipe).
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{S_ISLNK}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a symbolic link.
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
\begin{funcdesc}{S_ISSOCK}{mode}
|
1999-04-24 04:54:57 +08:00
|
|
|
Return non-zero if the mode is from a socket.
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{funcdesc}
|
|
|
|
|
1999-04-24 04:54:57 +08: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 22:55:43 +08:00
|
|
|
returned by \function{os.stat()}, \function{os.fstat()} or
|
|
|
|
\function{os.lstat()}.
|
1996-12-20 06:39:22 +08: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-11 03:34:52 +08:00
|
|
|
Size in bytes of a plain file; amount of data waiting on some special
|
|
|
|
files.
|
1996-12-20 06:39:22 +08: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}
|
1998-04-09 06:44:25 +08:00
|
|
|
Time of last status change (see manual pages for details).
|
1996-12-20 06:39:22 +08:00
|
|
|
\end{datadesc}
|
|
|
|
|
2001-01-11 03:34:52 +08: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 15:26:15 +08: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-12 00:02:08 +08: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-11 03:34:52 +08:00
|
|
|
|
1996-12-20 06:39:22 +08:00
|
|
|
Example:
|
|
|
|
|
1998-02-13 14:58:54 +08:00
|
|
|
\begin{verbatim}
|
1996-12-20 06:39:22 +08:00
|
|
|
import os, sys
|
|
|
|
from stat import *
|
|
|
|
|
1999-08-04 05:52:29 +08:00
|
|
|
def walktree(dir, callback):
|
|
|
|
'''recursively descend the directory rooted at dir,
|
|
|
|
calling the callback function for each regular file'''
|
1996-12-20 06:39:22 +08:00
|
|
|
|
|
|
|
for f in os.listdir(dir):
|
1999-08-04 05:52:29 +08:00
|
|
|
pathname = '%s/%s' % (dir, f)
|
|
|
|
mode = os.stat(pathname)[ST_MODE]
|
1996-12-20 06:39:22 +08:00
|
|
|
if S_ISDIR(mode):
|
1999-08-04 05:52:29 +08:00
|
|
|
# It's a directory, recurse into it
|
|
|
|
walktree(pathname, callback)
|
1996-12-20 06:39:22 +08:00
|
|
|
elif S_ISREG(mode):
|
1999-08-04 05:52:29 +08:00
|
|
|
# It's a file, call the callback function
|
|
|
|
callback(pathname)
|
1996-12-20 06:39:22 +08:00
|
|
|
else:
|
1999-08-04 05:52:29 +08:00
|
|
|
# Unknown file type, print a message
|
|
|
|
print 'Skipping %s' % pathname
|
1996-12-20 06:39:22 +08:00
|
|
|
|
1999-08-04 05:52:29 +08:00
|
|
|
def visitfile(file):
|
|
|
|
print 'visiting', file
|
1996-12-20 06:39:22 +08:00
|
|
|
|
1999-04-06 03:26:16 +08:00
|
|
|
if __name__ == '__main__':
|
1999-08-04 05:52:29 +08:00
|
|
|
walktree(sys.argv[1], visitfile)
|
1998-02-13 14:58:54 +08:00
|
|
|
\end{verbatim}
|