php gzseek 似乎超出文件大小
php gzseek seems beyond size of file
在过去的两年里,我在尝试确定文件大小时,尤其是 gz zip 压缩文件时,时断时续地遇到了一个奇怪的问题。我找到了解决方法,但它们并不理想。问题是 gzseek() 似乎总是寻找大约。 2.14GB 文件大小,与未压缩文件的大小无关。
测试时,我通过 1) 解压缩并保存为文本,以及 2) 使用 gzread() 一次读取 1MB 直到文件结束,确定了未压缩的文件大小。假设未压缩的文件大小为 13MB。
使用 gzseek() 和 gztell() 测试代码。这将使句柄前进 1mb / 1000000 字节,但始终持续到大约。 2.14GB,无论未压缩的文件大小如何:
//GZ file is opened ....
gzseek($Handle, 0, 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()
清除了 end-of-file 标志,以允许读取不断增长的文件。
只有当您在查找后进行读取时,它才会确定您是否处于或超过文件末尾。
与您的说法相反,您实际上找到了确定 gzip 文件未压缩大小的有效解决方案,即使用 gzread()
.
在过去的两年里,我在尝试确定文件大小时,尤其是 gz zip 压缩文件时,时断时续地遇到了一个奇怪的问题。我找到了解决方法,但它们并不理想。问题是 gzseek() 似乎总是寻找大约。 2.14GB 文件大小,与未压缩文件的大小无关。 测试时,我通过 1) 解压缩并保存为文本,以及 2) 使用 gzread() 一次读取 1MB 直到文件结束,确定了未压缩的文件大小。假设未压缩的文件大小为 13MB。
使用 gzseek() 和 gztell() 测试代码。这将使句柄前进 1mb / 1000000 字节,但始终持续到大约。 2.14GB,无论未压缩的文件大小如何:
//GZ file is opened ....
gzseek($Handle, 0, 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()
清除了 end-of-file 标志,以允许读取不断增长的文件。
只有当您在查找后进行读取时,它才会确定您是否处于或超过文件末尾。
与您的说法相反,您实际上找到了确定 gzip 文件未压缩大小的有效解决方案,即使用 gzread()
.