$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)) { $tar->addEmptyDir($dir . '/'); } elseif (\is_file($absolute)) { $tar->addFile($absolute, $dir); } } } elseif (\is_file($source)) { $tar->addFile($source, $relative); } } return true; } /** * {@inheritdoc} */ public static function unpack(string $source, string $destination) : bool { if (!\file_exists($source)) { return false; } $destination = \str_replace('\\', '/', $destination); $destination = \rtrim($destination, '/'); $tar = new \PharData($source); $tar->extractTo($destination . '/'); return true; } }