Zip entry filesize: примеры (PHP)

Получение размера файла в ZIP архиве через zip_entry_filesize
Раздел: Архивация
zip_entry_filesize(resource zip_entry): int
Функция zip_entry_filesize в PHP

Функция zip_entry_filesize возвращает исходный (несжатый) размер файла внутри ZIP-архива. Она является частью устаревшего модуля Zip, основанного на библиотеке ZZIPlib.

Назначение функции

Функция применяется при необходимости получить информацию о конкретном элементе архива в процессе его чтения. Она используется в связке с функциями zip_open(), zip_read(), zip_entry_open().

Аргументы функции

Функция принимает один обязательный параметр:

  • zip_entry (ресурс) — ресурс записи архива, полученный с помощью функции zip_read().
Возвращаемое значение

Функция возвращает исходный размер файла в байтах. В случае возникновения ошибки возвращается false.

Базовые примеры использования

Пример получения размера файла для первой записи в архиве.

$zip = zip_open('archive.zip');
if ($zip) {
    $entry = zip_read($zip);
    if ($entry) {
        $size = zip_entry_filesize($entry);
        echo "Размер файла: $size байт";
    }
    zip_close($zip);
}
Размер файла: 1024 байт
Чтение размеров всех файлов

Пример обхода всех элементов архива и вывода их размеров.

$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        $size = zip_entry_filesize($entry);
        echo "Файл: $name, Размер: $size байт
"; } zip_close($zip); }
Файл: document.txt, Размер: 1500 байт
Файл: image.jpg, Размер: 30720 байт
Похожие функции в PHP

Основной современной альтернативой является расширение ZipArchive.

Класс ZipArchive

Предоставляет объектно-ориентированный интерфейс с большей функциональностью.

$zip = new ZipArchive();
if ($zip->open('archive.zip') === TRUE) {
    $stat = $zip->statIndex(0);
    echo "Размер файла: " . $stat['size'] . " байт";
    $zip->close();
}
Функция zip_stat()

Функция из старого расширения Zip, возвращает массив со статистикой о записи.

$zip = zip_open('archive.zip');
$entry = zip_read($zip);
$stat = zip_stat($entry);
echo "Размер файла: " . $stat['size'] . " байт";

Рекомендуется использовать ZipArchive, так как оно активно поддерживается и предоставляет больше возможностей.

Аналоги в других языках

Zip entry filesize в Python

Используется модуль zipfile. Свойство file_size объекта ZipInfo.

import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zf:
    info = zf.getinfo('file.txt')
    print(f"Размер файла: {info.file_size} байт")
Размер файла: 1500 байт
JavaScript (Node.js)

В Node.js можно использовать модуль adm-zip.

const AdmZip = require('adm-zip');
const zip = new AdmZip('archive.zip');
const entry = zip.getEntries()[0];
console.log(`Размер файла: ${entry.header.size} байт`);

Zip entry filesize в MySQL

Прямого аналога для работы с ZIP-архивами в MySQL нет. Архивация обычно выполняется на уровне файловой системы или средствами языка программирования.

Типичные ошибки
Передача некорректного ресурса

Ошибка возникает при передаче параметра, не являющегося ресурсом записи архива.

$size = zip_entry_filesize('not_a_resource'); // Warning
Warning: zip_entry_filesize() expects parameter 1 to be resource, string given
Чтение после закрытия архива

Попытка использования ресурса после вызова zip_close().

$zip = zip_open('archive.zip');
$entry = zip_read($zip);
zip_close($zip);
$size = zip_entry_filesize($entry); // Некорректное поведение

Результат может быть непредсказуемым, возможно возвращение false.

Проверка существования файла

Отсутствие проверки успешности открытия архива.

$zip = zip_open('nonexistent.zip');
$entry = zip_read($zip); // false
$size = zip_entry_filesize($entry); // Warning
Warning: zip_entry_filesize() expects parameter 1 to be resource, boolean given
История изменений

Расширение Zip, в которое входит функция zip_entry_filesize, считается устаревшим с PHP 7.4.0. Официальная документация рекомендует использовать расширение ZipArchive.

Изменения в PHP 8

В PHP 8.0.0 расширение Zip по-прежнему доступно, но не рекомендуется к использованию. Функция zip_entry_filesize() продолжает работать, но ее сигнатура и поведение не претерпели изменений по сравнению с PHP 7.

Важное замечание: ресурсы (resource) в PHP 8 были заменены на объекты (objects) для некоторых типов, но для устаревшего расширения Zip это не привело к изменениям в работе функции.

Расширенные примеры
Сравнение сжатого и исходного размера
Пример php
$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $name = zip_entry_name($entry);
        $original = zip_entry_filesize($entry);
        $compressed = zip_entry_compressedsize($entry);
        $ratio = round(($original - $compressed) / $original * 100, 2);
        echo "Файл: $name | Оригинал: $original байт | Сжат: $compressed байт | Экономия: $ratio%
"; } zip_close($zip); }
Файл: data.txt | Оригинал: 5000 байт | Сжат: 1500 байт | Экономия: 70%
Фильтрация файлов по размеру
Пример php
$minSize = 1024; // 1 КБ
$maxSize = 10240; // 10 КБ

$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        $size = zip_entry_filesize($entry);
        if ($size >= $minSize && $size <= $maxSize) {
            $name = zip_entry_name($entry);
            echo "Подходит: $name ($size байт)
"; } } zip_close($zip); }
Чтение содержимого файлов определенного размера
Пример php
$zip = zip_open('archive.zip');
if (is_resource($zip)) {
    while ($entry = zip_read($zip)) {
        if (zip_entry_filesize($entry) < 100000) { // Файлы меньше 100 КБ
            if (zip_entry_open($zip, $entry, "r")) {
                $content = zip_entry_read($entry, zip_entry_filesize($entry));
                echo "Содержимое файла " . zip_entry_name($entry) . ":
"; echo htmlspecialchars($content) . "

"; zip_entry_close($entry); } } } zip_close($zip); }

PHP zip_entry_filesize function comments

En
Zip entry filesize Retrieve the actual file size of a directory entry