Как я могу обнаружить переполнение файлов Gzip и Bzip2 во время записи?

Мне нужно определить, что файл превышает указанный размер во время записи.
Когда я достигаю указанного размера, я должен прекратить писать и выдать исключение.

Пример для обычного файла:

$handle = fopen($filename, 'wb');
while (true) {
// its work
if (fstat($handle)['size'] + strlen($string) > BYTE_LIMIT) {
throw SizeOverflowException::withLimit(BYTE_LIMIT);
}

fwrite($this->handle, $string);
}
fclose($handle);

Или я могу самостоятельно посчитать использованные байты

$handle = fopen($filename, 'wb');
$used_bytes = 0;
while (true) {
if ($used_bytes + strlen($string) > BYTE_LIMIT) {
throw SizeOverflowException::withLimit(BYTE_LIMIT);
}

fwrite($this->handle, $string);
$used_bytes += strlen($string);
}
fclose($handle);

Пример записи Gzip:

$handle = gzopen($filename, 'wb9');
while (true) {
// not work
// fstat($handle) === false
//if (fstat($handle)['size'] + strlen($string) > BYTE_LIMIT) {
//    throw SizeOverflowException::withLimit(BYTE_LIMIT);
//}

gzwrite($this->handle, $string);
}
gzclose($handle);

Аналогично для Bzip2:

$handle = bzopen($filename, 'w');
while (true) {
// not work
// fstat($handle) === false
//if (fstat($handle)['size'] + strlen($string) > BYTE_LIMIT) {
//    throw SizeOverflowException::withLimit(BYTE_LIMIT);
//}

bzwrite($this->handle, $string);
}
bzclose($handle);

Я понимаю почему fstat() не работает в этом случае, но как я могу решить эту проблему?

Теперь я могу рассчитать только сколько байтов будет использовано в несжатом режиме.

0

Решение

Вместо этого вы можете постепенно сжимать в памяти, используя deflate_init а также deflate_add, используя кодировку ZLIB_ENCODING_GZIPи запишите сжатые данные как обычно fwrite, Затем вы можете считать записанные сжатые байты и остановиться на указанном вами размере.

1

Другие решения

Других решений пока нет …