diff options
Diffstat (limited to 'Lib/dos-8x3/statcach.py')
-rwxr-xr-x | Lib/dos-8x3/statcach.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/Lib/dos-8x3/statcach.py b/Lib/dos-8x3/statcach.py new file mode 100755 index 0000000..770aef0 --- /dev/null +++ b/Lib/dos-8x3/statcach.py @@ -0,0 +1,82 @@ +# 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]) |