83 lines
1.5 KiB
Python
83 lines
1.5 KiB
Python
# Module 'statcache'
|
|
#
|
|
# Maintain a cache of file stats.
|
|
# There are functions to reset the cache or to selectively remove items.
|
|
|
|
import os
|
|
from stat import *
|
|
|
|
# The cache.
|
|
# Keys are pathnames, values are `os.stat' outcomes.
|
|
#
|
|
cache = {}
|
|
|
|
|
|
# Stat a file, possibly out of the cache.
|
|
#
|
|
def stat(path):
|
|
if cache.has_key(path):
|
|
return cache[path]
|
|
cache[path] = ret = os.stat(path)
|
|
return ret
|
|
|
|
|
|
# Reset the cache completely.
|
|
#
|
|
def reset():
|
|
global cache
|
|
cache = {}
|
|
|
|
|
|
# Remove a given item from the cache, if it exists.
|
|
#
|
|
def forget(path):
|
|
if cache.has_key(path):
|
|
del cache[path]
|
|
|
|
|
|
# Remove all pathnames with a given prefix.
|
|
#
|
|
def forget_prefix(prefix):
|
|
n = len(prefix)
|
|
for path in cache.keys():
|
|
if path[:n] == prefix:
|
|
del cache[path]
|
|
|
|
|
|
# Forget about a directory and all entries in it, but not about
|
|
# entries in subdirectories.
|
|
#
|
|
def forget_dir(prefix):
|
|
if prefix[-1:] == '/' and prefix <> '/':
|
|
prefix = prefix[:-1]
|
|
forget(prefix)
|
|
if prefix[-1:] <> '/':
|
|
prefix = prefix + '/'
|
|
n = len(prefix)
|
|
for path in cache.keys():
|
|
if path[:n] == prefix:
|
|
rest = path[n:]
|
|
if rest[-1:] == '/': rest = rest[:-1]
|
|
if '/' not in rest:
|
|
del cache[path]
|
|
|
|
|
|
# Remove all pathnames except with a given prefix.
|
|
# Normally used with prefix = '/' after a chdir().
|
|
#
|
|
def forget_except_prefix(prefix):
|
|
n = len(prefix)
|
|
for path in cache.keys():
|
|
if path[:n] <> prefix:
|
|
del cache[path]
|
|
|
|
|
|
# Check for directory.
|
|
#
|
|
def isdir(path):
|
|
try:
|
|
st = stat(path)
|
|
except os.error:
|
|
return 0
|
|
return S_ISDIR(st[ST_MODE])
|