forked from p15670423/monkey
62 lines
1.4 KiB
Python
62 lines
1.4 KiB
Python
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)
|