2014-07-26 15 views
6

Zip arşivindeki bir dosyanın belirli bir satırını (200'üncü) yazdırmak istiyorum.PHP - Dosyayı zip dosyasında işaret eden dosya içinde mi arıyorsunuz?

$file = new SplFileObject("zip://archive.zip#file.txt"); 
$file->seek(200); 
echo $file->key() . "\n"; 
echo $file->current(); 

Ama dosyayı açmak ve parametre "file.txt" ile SplFileObject, Tamam çalışıyor oluşturursanız ben

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 

olsun: Aşağıdaki çalışıyorum. Aramanın sıkıştırılmış dosyalar için çalışmadığı herhangi bir yerde belgelenmiş mi? Onu bulamadım. Yoksa yanlış bir şey yapıyorum? Teşekkürler.

+0

Sorunuz bana bir şey öğretti. http://php.net/manual/en/ziparchive.getstream.php Görüyorum ki 'fopen()' zip: // 'protokollerini böyle alır. 'SplFileObject''nın yaptıklarından emin değilim. Şu anda içinde bulunduğunuz dizini ararken görünen 'archive.zip' dosyasındaki 'file.txt 'dosyasına başvurmaya çalıştığınızı görüyorum. SplFileObject'in neden getStream() değerine sahip olduğunu merak ediyorum. fermuarlarla çalışma yöntemi. 'ZipArchive'nin' open' yöntemi, argüman olarak belirtilen dosya için bir dosya tanıtıcısını döndürmek için 'getStream' yöntemini kullanabilen bir Nesne döndürür. – PHPglue

cevap

2

İyi soru. İstediğiniz davranış, kullandığınız sözdizimiyle açıkça ifade edilir. Bunun bir hata olduğunu düşünüyorum. Muhtemelen http://bugs.php.net numaralı telefondan rapor edebilirsiniz. Akış, geri sarma ve önbelleğe alınmadan dahili olarak kullanılmalıdır.

Uyarı! SplFileObject ile çözüm vahşiden daha fazladır.

Geri sarma işlemine izin vermemek için NoRewind gereklidir. Daha sonra, akış içeriğini dahili olarak depolamak ve aranabilir hale getirmek için Önbellek gereklidir. Sonra LimitIterator

hattına 200 etmeye ihtiyaç vardır İşte başlıyoruz:

$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); 
} 
İlgili konular