PHP ZipArchive - Поиск содержимого строки для строки - PullRequest
2 голосов
/ 26 мая 2020

Я хотел бы найти файлы по заданной строке в заархивированной папке.

В настоящее время я могу получить список моих заархивированных файлов, выполнив следующие действия:

$zip = new ZipArchive;
$res = $zip->open("./test.zip");
var_dump($res);
for( $i = 0; $i < $zip->numFiles; $i++ ){
    $stat = $zip->statIndex( $i );
    var_dump($stat['name']);
}
$zip->close();

Я был просматривая найденные решения здесь . Единственное решение, которое, кажется, затрагивает то, что мне нужно, является процедурным и имеет комментарий, в котором отмечается следующее:

zip_entry_read по умолчанию читает только 1024 байта из файла ... поэтому содержимое не является полным содержимым файла файл, но только первые 1024 байта

Есть ли способ (OOP) для поиска строки во всех моих записях, прежде чем я решу распаковать свою папку? Кроме того, если бы я хотел отобразить полное содержимое заархивированного файла, нужно ли его сначала распаковать? И наконец, если полное содержимое не может быть отображено без разархивирования, есть ли способ извлечь один файл из заархивированной папки?

Ответы [ 2 ]

2 голосов
/ 26 мая 2020

Вы можете использовать ZipArchive :: getFromName () или ZipArchive :: getFromIndex () для чтения содержимого заархивированного файла.

$zip = new ZipArchive;
$res = $zip->open("./test.zip");
for( $i = 0; $i < $zip->numFiles; $i++ ){
    var_dump($zip->getFromIndex($i));
}
$zip->close();
1 голос
/ 26 мая 2020

Если вы хотите найти содержимое каждого файла, распаковка должна произойти, несмотря ни на что. Это может не произойти в формате на диске, но где-то произойдет, например, в памяти. Просто к вашему сведению, вот как работают сжатые файлы.

Я бы отказался от класса OOP ZipArchive, это случайный факт, существует ли метод, соответствующий функции -

Если вы хотите найти содержимое файла, вам нужно передать количество байтов в качестве второго параметра в zip_entry_read() для соответствующей записи. Чтобы получить количество байтов, вызовите zip_entry_filesize

$zip = zip_open('./file.zip');
while ($entry = zip_read($zip)) {
    // This is the uncompressed size
    $true_size = zip_entry_filesize($entry);

    // Read everything
    $true_entry = zip_entry_read($entry, $true_size);

    $idx = mb_strpos($true_entry, 'string-you-are-looking-for');
    if ($idx) {
        echo 'Found!';
    }
}

Переменная $true_entry внутри l oop будет отдельным файлом, и вы можете получить его имя, используя zip_entry_name.

...