| """Maintain a cache of stat() information on files. |
| |
| 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 = {} |
| |
| |
| def stat(path): |
| """Stat a file, possibly out of the cache.""" |
| if cache.has_key(path): |
| return cache[path] |
| cache[path] = ret = os.stat(path) |
| return ret |
| |
| |
| def reset(): |
| """Reset the cache completely.""" |
| global cache |
| cache = {} |
| |
| |
| def forget(path): |
| """Remove a given item from the cache, if it exists.""" |
| if cache.has_key(path): |
| del cache[path] |
| |
| |
| def forget_prefix(prefix): |
| """Remove all pathnames with a given prefix.""" |
| n = len(prefix) |
| for path in cache.keys(): |
| if path[:n] == prefix: |
| del cache[path] |
| |
| |
| def forget_dir(prefix): |
| """Forget about a directory and all entries in it, but not about |
| entries in subdirectories.""" |
| 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] |
| |
| |
| def forget_except_prefix(prefix): |
| """Remove all pathnames except with a given prefix. |
| Normally used with prefix = '/' after a chdir().""" |
| n = len(prefix) |
| for path in cache.keys(): |
| if path[:n] <> prefix: |
| del cache[path] |
| |
| |
| def isdir(path): |
| """Check for directory.""" |
| try: |
| st = stat(path) |
| except os.error: |
| return 0 |
| return S_ISDIR(st[ST_MODE]) |