from io import BytesIO import os __author__ = 'hoffer' MONKEYFS_PREFIX = 'monkeyfs://' open_orig = open class VirtualFile(BytesIO): _vfs = {} # virtual File-System def __init__(self, name, mode='r', buffering=None): if not name.startswith(MONKEYFS_PREFIX): name = MONKEYFS_PREFIX + name self.name = name self._mode = mode if name in VirtualFile._vfs: super(VirtualFile, self).__init__(self._vfs[name]) else: super(VirtualFile, self).__init__('') def flush(self): super(VirtualFile, self).flush() VirtualFile._vfs[self.name] = self.getvalue() @staticmethod def getsize(path): return len(VirtualFile._vfs[path]) @staticmethod def isfile(path): return path in VirtualFile._vfs def getsize(path): if path.startswith(MONKEYFS_PREFIX): return VirtualFile.getsize(path) else: return os.stat(path).st_size def isfile(path): if path.startswith(MONKEYFS_PREFIX): return VirtualFile.isfile(path) else: return os.path.isfile(path) def virtual_path(name): return "%s%s" % (MONKEYFS_PREFIX, name) def open(name, mode='r', buffering=-1): # use normal open for regular paths, and our "virtual" open for monkeyfs:// paths if name.startswith(MONKEYFS_PREFIX): return VirtualFile(name, mode, buffering) else: return open_orig(name, mode=mode, buffering=buffering)