<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=FileInfo.py</id>
	<title>FileInfo.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://performiq.com/kb/index.php?action=history&amp;feed=atom&amp;title=FileInfo.py"/>
	<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=FileInfo.py&amp;action=history"/>
	<updated>2026-05-20T20:42:07Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://performiq.com/kb/index.php?title=FileInfo.py&amp;diff=3094&amp;oldid=prev</id>
		<title>PeterHarding at 06:06, 19 July 2009</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=FileInfo.py&amp;diff=3094&amp;oldid=prev"/>
		<updated>2009-07-19T06:06:55Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:06, 19 July 2009&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l101&quot;&gt;Line 101:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 101:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Python]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Category:Python]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:Examples]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
	<entry>
		<id>https://performiq.com/kb/index.php?title=FileInfo.py&amp;diff=2390&amp;oldid=prev</id>
		<title>PeterHarding: New page: =Script= &lt;pre&gt; #!/usr/bin/env python # #  A bunch of convenience functions for testing file attributes. # #  Written by Sean Reifschneider &lt;jafo-python-fileinfo@tummy.com&gt; #  Please direct...</title>
		<link rel="alternate" type="text/html" href="https://performiq.com/kb/index.php?title=FileInfo.py&amp;diff=2390&amp;oldid=prev"/>
		<updated>2008-07-11T07:47:29Z</updated>

		<summary type="html">&lt;p&gt;New page: =Script= &amp;lt;pre&amp;gt; #!/usr/bin/env python # #  A bunch of convenience functions for testing file attributes. # #  Written by Sean Reifschneider &amp;lt;jafo-python-fileinfo@tummy.com&amp;gt; #  Please direct...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=Script=&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/env python&lt;br /&gt;
#&lt;br /&gt;
#  A bunch of convenience functions for testing file attributes.&lt;br /&gt;
#&lt;br /&gt;
#  Written by Sean Reifschneider &amp;lt;jafo-python-fileinfo@tummy.com&amp;gt;&lt;br /&gt;
#  Please direct all comments to him at the above address.&lt;br /&gt;
#&lt;br /&gt;
#  VERSION: 1.0 1999-01-04&lt;br /&gt;
&lt;br /&gt;
#TODO:&lt;br /&gt;
#  Does not implement -O and -G tests from &amp;quot;test&amp;quot; (is file effectively&lt;br /&gt;
#    uid or gid you)?&lt;br /&gt;
#  Find a common naming scheme (or two -- posix-like and &amp;quot;other&amp;quot;?) for methods&lt;br /&gt;
#    f_ok() =&amp;gt; exists()&lt;br /&gt;
#    r_ok() =&amp;gt; readable()&lt;br /&gt;
#    x_ok() =&amp;gt; executeable()&lt;br /&gt;
#    ifreg() =&amp;gt; is_reg()?&lt;br /&gt;
#    ifdir() =&amp;gt; is_dir()?&lt;br /&gt;
#    is_woth() =&amp;gt; s_iwoth() or write_other()?&lt;br /&gt;
#    is_rgrp() =&amp;gt; s_irgrp() or read_group()?&lt;br /&gt;
#    is_suid() =&amp;gt; s_isuid() or setuid()?&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import stat&lt;br /&gt;
import types&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _ok(name, mode):&lt;br /&gt;
	try: os.access(name, mode)&lt;br /&gt;
	except: return(0)&lt;br /&gt;
	return 1&lt;br /&gt;
&lt;br /&gt;
def f_ok(name): return(_ok(name, os.F_OK))&lt;br /&gt;
def r_ok(name): return(_ok(name, os.R_OK))&lt;br /&gt;
def w_ok(name): return(_ok(name, os.W_OK))&lt;br /&gt;
def x_ok(name): return(_ok(name, os.X_OK))&lt;br /&gt;
&lt;br /&gt;
#  stat routine that automaticly selects stat/fstat/lstat (if followsymlink)&lt;br /&gt;
&lt;br /&gt;
def mstat(name, followsymlink = 1):&lt;br /&gt;
	if type(name) == types.StringType:&lt;br /&gt;
		info = os.stat(name)&lt;br /&gt;
		if followsymlink and stat.S_ISLNK(info[stat.ST_MODE]):&lt;br /&gt;
			return(os.lstat(name))&lt;br /&gt;
		return(info)&lt;br /&gt;
	return(os.fstat(name))&lt;br /&gt;
&lt;br /&gt;
def _mode(name): return(mstat(name)[stat.ST_MODE])&lt;br /&gt;
&lt;br /&gt;
def mode(name): return(stat.S_IMODE(_mode(name)))&lt;br /&gt;
def ifreg(name): return(stat.S_ISREG(_mode(name)))&lt;br /&gt;
def ifdir(name): return(stat.S_ISDIR(_mode(name)))&lt;br /&gt;
def ifchr(name): return(stat.S_ISCHR(_mode(name)))&lt;br /&gt;
def ifblk(name): return(stat.S_ISBLK(_mode(name)))&lt;br /&gt;
def iffifo(name): return(stat.S_ISFIFO(_mode(name)))&lt;br /&gt;
def iflnk(name): return(stat.S_ISLNK(_mode(name)))&lt;br /&gt;
def ifsock(name): return(stat.S_ISSOCK(_mode(name)))&lt;br /&gt;
&lt;br /&gt;
def is_suid(name): return(_mode(name) &amp;amp; stat.S_ISUID == stat.S_ISUID)&lt;br /&gt;
def is_sgid(name): return(_mode(name) &amp;amp; stat.S_ISGID == stat.S_ISGID)&lt;br /&gt;
def is_svtx(name): return(_mode(name) &amp;amp; stat.S_ISVTX == stat.S_ISVTX)&lt;br /&gt;
def is_read(name): return(_mode(name) &amp;amp; stat.S_IREAD == stat.S_IREAD)&lt;br /&gt;
def is_write(name): return(_mode(name) &amp;amp; stat.S_IWRITE == stat.S_IWRITE)&lt;br /&gt;
def is_exec(name): return(_mode(name) &amp;amp; stat.S_IEXEC == stat.S_IEXEC)&lt;br /&gt;
def is_rwxu(name): return(_mode(name) &amp;amp; stat.S_IRWXU == stat.S_IRWXU)&lt;br /&gt;
def is_rusr(name): return(_mode(name) &amp;amp; stat.S_IRUSR == stat.S_IRUSR)&lt;br /&gt;
def is_wusr(name): return(_mode(name) &amp;amp; stat.S_IWUSR == stat.S_IWUSR)&lt;br /&gt;
def is_xusr(name): return(_mode(name) &amp;amp; stat.S_IXUSR == stat.S_IXUSR)&lt;br /&gt;
def is_rwxg(name): return(_mode(name) &amp;amp; stat.S_IRWXG == stat.S_IRWXG)&lt;br /&gt;
def is_rgrp(name): return(_mode(name) &amp;amp; stat.S_IRGRP == stat.S_IRGRP)&lt;br /&gt;
def is_wgrp(name): return(_mode(name) &amp;amp; stat.S_IWGRP == stat.S_IWGRP)&lt;br /&gt;
def is_xgrp(name): return(_mode(name) &amp;amp; stat.S_IXGRP == stat.S_IXGRP)&lt;br /&gt;
def is_rwxo(name): return(_mode(name) &amp;amp; stat.S_IRWXO == stat.S_IRWXO)&lt;br /&gt;
def is_roth(name): return(_mode(name) &amp;amp; stat.S_IROTH == stat.S_IROTH)&lt;br /&gt;
def is_woth(name): return(_mode(name) &amp;amp; stat.S_IWOTH == stat.S_IWOTH)&lt;br /&gt;
def is_xoth(name): return(_mode(name) &amp;amp; stat.S_IXOTH == stat.S_IXOTH)&lt;br /&gt;
&lt;br /&gt;
def is_empty(name): return(mstat(name)[stat.ST_SIZE] == 0)&lt;br /&gt;
def size(name): return(mstat(name)[stat.ST_SIZE])&lt;br /&gt;
def isatty(file):&lt;br /&gt;
	try:&lt;br /&gt;
		os.ttyname(file)&lt;br /&gt;
		return(1)&lt;br /&gt;
	except OSError, e:&lt;br /&gt;
		if e == &amp;#039;[Errno 2] No such file or directory&amp;#039;:&lt;br /&gt;
			return(0)&lt;br /&gt;
		raise&lt;br /&gt;
&lt;br /&gt;
#  returns age difference between lhs and rhs files (in seconds):&lt;br /&gt;
#    &amp;lt;0 lhs older than rhs&lt;br /&gt;
#    &amp;gt;0 lhs newer than rhs&lt;br /&gt;
#     0 lhs same age as rhs&lt;br /&gt;
def mtime_cmp(lhs, rhs): return(mtime(lhs) - mtime(rhs))&lt;br /&gt;
def mtime(file): return(mstat(lhs)[stat.ST_MTIME])&lt;br /&gt;
def mtime_newer(lhs, rhs): return(mtime_cmp(lhs, rhs) &amp;gt; 0)&lt;br /&gt;
def mtime_older(lhs, rhs): return(mtime_cmp(lhs, rhs) &amp;lt; 0)&lt;br /&gt;
def mtime_equal(lhs, rhs): return(mtime_cmp(lhs, rhs) == 0)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Python]]&lt;/div&gt;</summary>
		<author><name>PeterHarding</name></author>
	</entry>
</feed>