123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- import io
- import os
- import zipfile
- class ZipStream(object):
- def __init__(self, dir_path):
- self.dir_path = dir_path
- self.pos = 0
- self.buff_pos = 0
- self.zf = zipfile.ZipFile(self, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
- self.buff = io.BytesIO()
- self.file_list = self.getFileList()
- def getFileList(self):
- for root, dirs, files in os.walk(self.dir_path):
- for file in files:
- file_path = root + "/" + file
- relative_path = os.path.join(os.path.relpath(root, self.dir_path), file)
- yield file_path, relative_path
- self.zf.close()
- def read(self, size=60 * 1024):
- for file_path, relative_path in self.file_list:
- self.zf.write(file_path, relative_path)
- if self.buff.tell() >= size:
- break
- self.buff.seek(0)
- back = self.buff.read()
- self.buff.truncate(0)
- self.buff.seek(0)
- self.buff_pos += len(back)
- return back
- def write(self, data):
- self.pos += len(data)
- self.buff.write(data)
- def tell(self):
- return self.pos
- def seek(self, pos, whence=0):
- if pos >= self.buff_pos:
- self.buff.seek(pos - self.buff_pos, whence)
- self.pos = pos
- def flush(self):
- pass
- if __name__ == "__main__":
- zs = ZipStream(".")
- out = open("out.zip", "wb")
- while 1:
- data = zs.read()
- print("Write %s" % len(data))
- if not data:
- break
- out.write(data)
- out.close()
|