如何解决php gzseek似乎超出了文件的大小
在过去两年中,我在尝试确定文件(尤其是gz zip压缩文件)的大小时遇到了一个奇怪的问题。我找到了解决方法,但它们并不理想。问题在于,gzseek()似乎总是寻找最多。不管未压缩文件的大小如何,文件大小均为2.14GB。 在测试时,我通过以下两种方式建立了未压缩文件的大小:1)解压缩并另存为文本,以及2)使用gzread()每次读取1MB直到文件结束。假设未压缩的文件大小为13MB。
使用gzseek()和gztell()测试代码。这将使句柄前进1mb / 1000000字节,但始终继续到大约。 2.14GB,无论未压缩的文件大小如何:
//GZ file is opened ....
gzseek($Handle,SEEK_SET);
while (true) {
//Seek through file advancing offset with 1000000 bytes each time
$Eof = gzseek($Handle,1000000,SEEK_CUR); //0 or -1 if passed eof
//This will dump the handle position incrementing 1000000 bytes at the time but continue until
//approx. 2.14 GB even through file is 13MB uncompressed
var_dump(gztell($Handle));
//When the handle (via gztell() ) shows 2.14GB,the gzseek() returns -1 which means it
//has reached / gone pas end of file
if ( $Eof !== -1 ) {
//This will only be true once the gztell() shows approx. 2.14GB
break;
}
}
现在,如果改为使用gzread()可以正常工作,则将句柄前进1mb / 1000000字节,直到13mb。例如:
while ( !gzeof($Handle) ) {
$Data = gzread($Handle,1000000);
}
在过去几年中对此进行了大量研究,但我从未找到一种可行的解决方案来测量gz文件的文件大小,也没有找到关于为什么无法使用gzseek完成该问题的任何报告,我觉得有些奇怪。 gzseek无法正常工作,我希望可以找到报告的报告,或者我真的在这里遗漏了一些东西。感谢您的帮助,克里斯
解决方法
您缺少的是,就像fseek()
一样,gzseek()
可以并将读或写指针设置为您要求的任何位置,包括文件末尾。这些功能不检查文件结尾。实际上,fseek()
清除文件结束标志,以允许读取正在增长的文件。
仅当您在查找之后进行读取时,它才会确定您是在文件末尾还是在文件末尾。
与您的主张相反,您实际上找到了一种确定gzip文件未压缩大小的有效解决方案,该解决方案将使用gzread()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。