fdpos) && $info->fdpos) { $read = $info->fdpos; fseek($fd, $info->fdpos); } if(isset($info->fdgzpos) && $info->fdgzpos) { $write = $info->fdgzpos; fseek($gzfd, $info->fdgzpos); } while(!feof($fd)) { $write += fwrite($gzfd, gzencode(fread($fd, $chunkSize), $compressionLevel)); $read += $chunkSize; self::_putInfo($info_file, [ 'fdpos' => $read, 'fdgzpos' => $write, ]); if($callback) $callback($read, DirIteratorFile::safe_filesize($file)); } if(feof($fd)) { @unlink($file); @unlink($info_file); } fclose($fd); fclose($gzfd); } /** * @throws GzipException */ public static function decompress($file, ?callable $callback=null, $chunkSize=self::DEFAULT_DECOMPRESS_CHUNK_SIZE) { if(!file_exists($file) || !is_file($file)) throw new GzipException("Source file not found"); $info_file = $file . '.decompress.info'; $info = self::_getInfo($info_file); // remove .gz suffix $target = substr($file, 0, -3); $fd = fopen($target, 'a'); $gzfd = gzopen($file, 'rb'); $read = $write = 0; if(isset($info->fdpos) && $info->fdpos) { $write = $info->fdpos; fseek($fd, $info->fdpos); } if(isset($info->fdgzpos) && $info->fdgzpos) { $read = $info->fdgzpos; gzseek($gzfd, $info->fdgzpos); } while(!feof($gzfd)) { $write += fwrite($fd, gzread($gzfd, $chunkSize)); $read += $chunkSize; self::_putInfo($info_file, [ 'fdpos' => $write, 'fdgzpos' => $read, ]); if($callback) $callback( 'Gzip', 'Decompressing', (int) (DirIteratorFile::safe_filesize($file) * 3), // estimating X3 compression ratio, just for percentage calc $read) ; } if(feof($gzfd)) { @unlink($file); @unlink($info_file); } fclose($fd); gzclose($gzfd); } }