import os from ctypes import c_ulong from collections import namedtuple from binascii import crc32 FileInfo = namedtuple("FileRecord", "path, crc32, size, mtime") def os_walkf(root, filterDir=None, filterName=None, filterExt=None): for base, dirs, names in os.walk(root): if filterDir: dirs[:] = [dir for dir in dirs if filterDir(dir)] if filterName: if filterExt: for name in names: if filterName(name) and filterExt(os.path.splitext(name)[1]): yield os.path.join(base, name) else: for name in names: if filterName(name): yield os.path.join(base, name) else: if filterExt: for name in names: if filterExt(os.path.splitext(name)[1]): yield os.path.join(base, name) else: for name in names: yield os.path.join(base, name) def os_resetdirs(root): if os.access(root, os.R_OK): for base, dirs, names in os.walk(root): for name in names: os.remove(os.path.join(base, name)) else: os.makedirs(root) def os_savefile(path, data, mode="wb"): branch, leaf = os.path.split(path) if not os.access(branch, os.R_OK): os.makedirs(branch) open(path, mode).write(data) def os_fileinfo(path): data = open(path, "rb").read() return FileInfo(path, crc32(data), len(data), os.stat(path).st_mtime)