zlib巨难问题(200分)

  • 主题发起人 主题发起人 cyberwalker
  • 开始时间 开始时间
C

cyberwalker

Unregistered / Unconfirmed
GUEST, unregistred user!
有个很大的zlib格式的压缩文件,全部decompress需要很多时间, 有没有可能只decompress一部分,感谢大大
 
如果是一个,估计没有<br><br>不过它解压时不占用太多ram的
 
楼主的意思是想从压缩文件里释放其中一部分文件,<br>可能要从压缩文件的结构下手<br><br>刚才试了一下,用多个小文件压缩成一个大的RAR文件,<br>然后用UE打开,人为的删除尾部一些数据,保存后,<br>用WINRAR打开,发现有错误提示,<br>但是,仍然可以解压缩前面的一些文件。<br><br>由此猜想,压缩文件是不是有可能在文件头里面保存各个文件的索引?
 
看你是用什么压缩的
 
用vclzip多好。
 
狠k了一下zlib的sample,终于解决问题了<br>用到inflate函数, 最小只解压64字节都可以啊<br>20m的文件读取文件头不要1秒 ;-)<br>function Inf(var input: PChar; var output: PChar): integer;<br><br> &nbsp;function InflateInit(var stream: z_stream): Integer;<br> &nbsp;begin<br> &nbsp; &nbsp;result := InflateInit_(stream, zlibVersion, SizeOf(z_stream));<br> &nbsp;end;<br><br>var<br> &nbsp;ret: integer;<br> &nbsp;have: WORD;<br> &nbsp;strm: z_stream;<br>begin<br> &nbsp;strm.zalloc := Z_NULL;<br> &nbsp;strm.zfree := Z_NULL;<br> &nbsp;strm.opaque := Z_NULL;<br> &nbsp;strm.avail_in := 0;<br> &nbsp;strm.next_in := Z_NULL;<br> &nbsp;ret:= inflateInit(strm);<br><br> &nbsp;if ret&lt;&gt;Z_OK then<br> &nbsp;begin<br> &nbsp; &nbsp;result:=ret;<br> &nbsp; &nbsp;exit;<br> &nbsp;end;<br><br> &nbsp;repeat<br> &nbsp; &nbsp;strm.avail_in := CHUNK;<br> &nbsp; &nbsp;strm.next_in := input;<br><br> &nbsp; &nbsp;repeat<br> &nbsp; &nbsp; &nbsp;strm.avail_out := CHUNK;<br> &nbsp; &nbsp; &nbsp;strm.next_out := output;<br> &nbsp; &nbsp; &nbsp;ret := inflate(@strm, Z_NO_FLUSH);<br> &nbsp; &nbsp; &nbsp;have := CHUNK - strm.avail_out;<br><br> &nbsp; &nbsp;until strm.avail_out &lt;&gt; 0;<br><br> &nbsp; &nbsp;ret:= Z_STREAM_END;<br> &nbsp;until ret = Z_STREAM_END;<br><br> &nbsp;inflateEnd(@strm);<br><br> &nbsp;result:= Z_STREAM_END<br>end;
 
多人接受答案了。
 
后退
顶部