open($this->archive_file); if ($archive === true) { Folder::create($destination); if (!$zip->extractTo($destination)) { throw new RuntimeException('ZipArchiver: ZIP failed to extract ' . $this->archive_file . ' to ' . $destination); } $zip->close(); return $this; } throw new RuntimeException('ZipArchiver: Failed to open ' . $this->archive_file); } /** * @param string $source * @param callable|null $status * @return $this */ public function compress($source, callable $status = null) { if (!extension_loaded('zip')) { throw new InvalidArgumentException('ZipArchiver: Zip PHP module not installed...'); } if (!file_exists($source)) { throw new InvalidArgumentException('ZipArchiver: ' . $source . ' cannot be found...'); } $zip = new ZipArchive(); if (!$zip->open($this->archive_file, ZipArchive::CREATE)) { throw new InvalidArgumentException('ZipArchiver:' . $this->archive_file . ' cannot be created...'); } // Get real path for our folder $rootPath = realpath($source); $files = $this->getArchiveFiles($rootPath); $status && $status([ 'type' => 'count', 'steps' => iterator_count($files), ]); foreach ($files as $file) { $filePath = $file->getPathname(); $relativePath = ltrim(substr($filePath, strlen($rootPath)), '/'); if ($file->isDir()) { $zip->addEmptyDir($relativePath); } else { $zip->addFile($filePath, $relativePath); } $status && $status([ 'type' => 'progress', ]); } $status && $status([ 'type' => 'message', 'message' => 'Compressing...' ]); $zip->close(); return $this; } /** * @param array $folders * @param callable|null $status * @return $this */ public function addEmptyFolders($folders, callable $status = null) { if (!extension_loaded('zip')) { throw new InvalidArgumentException('ZipArchiver: Zip PHP module not installed...'); } $zip = new ZipArchive(); if (!$zip->open($this->archive_file)) { throw new InvalidArgumentException('ZipArchiver: ' . $this->archive_file . ' cannot be opened...'); } $status && $status([ 'type' => 'message', 'message' => 'Adding empty folders...' ]); foreach ($folders as $folder) { $zip->addEmptyDir($folder); $status && $status([ 'type' => 'progress', ]); } $zip->close(); return $this; } }