我想在zip存档中打印文件的特定行(比如说第200行).我正在尝试以下方法:
$file = new SplFileObject("zip://archive.zip#file.txt");
$file->seek(200);
echo $file->key() . "\n";
echo $file->current();
Run Code Online (Sandbox Code Playgroud)
但我明白了
PHP Warning: SplFileObject::seek(): stream does not support seeking in script.php on line 2
PHP Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot rewind file zip://archive.zip#file.txt' in script.php:2
Run Code Online (Sandbox Code Playgroud)
如果我解压缩文件并创建SplFileObjectwith参数"file.txt",它可以正常工作.它是否记录在寻求不适用于压缩文件的任何地方?我无法找到它.或者我做错了什么?谢谢.
好问题。您想要的行为由您使用的语法清楚地表达。我认为这是一个错误。您可以在http://bugs.php.net报告它。该流应在内部进行无回滚处理并进行缓存。
被警告!SplFileObject 的解决方案非常疯狂。
需要 NoRewind 来禁止倒带。那么就需要Cache来在内部存储流内容并使其可查找。然后需要 LimitIterator 来查找第 200 行。
开始了:
$obj = new SplFileObject("zip://archive.zip#file.txt");
$norewind = new NoRewindIterator($obj);
$caching = new CachingIterator($norewind);
$limit = new LimitIterator($caching, 200, 1);
foreach ($limit as $i => $line)
{
printf("%03d: %s", $i, $line);
}
Run Code Online (Sandbox Code Playgroud)