open($destination, $overwrite ? \ZipArchive::CREATE | \ZipArchive::OVERWRITE : \ZipArchive::CREATE)) { return false; } /** * @var string $source * @var string $relative */ foreach ($sources as $source => $relative) { if (\is_numeric($source) && \realpath($relative) !== false) { $source = $relative; $relative = ''; } $source = \realpath($source); if ($source === false) { continue; } $source = \str_replace('\\', '/', $source); if (!\file_exists($source)) { continue; } if (\is_dir($source)) { $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source), \RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { $file = \str_replace('\\', '/', $file); /* Ignore . and .. */ if (($pos = \mb_strrpos($file, '/')) === false || \in_array(\mb_substr($file, $pos + 1), ['.', '..']) ) { continue; } $absolute = \realpath($file); $absolute = \str_replace('\\', '/', (string) $absolute); $dir = \str_replace($source . '/', '', $relative . '/' . $absolute); if (\is_dir($absolute)) { $zip->addEmptyDir($dir . '/'); } elseif (\is_file($absolute)) { $zip->addFile($absolute, $dir); } } } elseif (\is_file($source)) { $zip->addFile($source, $relative); } } return $zip->close(); } /** * {@inheritdoc} */ public static function unpack(string $source, string $destination) : bool { if (!\file_exists($source)) { return false; } $destination = \str_replace('\\', '/', $destination); $destination = \rtrim($destination, '/'); $zip = new \ZipArchive(); if (!$zip->open($source)) { return false; } $zip->extractTo($destination . '/'); return $zip->close(); } }