<?php namespace Spip\Archiver; /** * {@inheritDoc} * Implémentation spécifique au fichier .tar. */ class TarArchive implements ArchiveInterface { protected \PharData $tar; protected ?string $filename = null; protected NoDotFilterIterator $source; protected bool $gzCompress = false; public function open(string $filename, string $mode): int { $this->filename = $filename; $this->tar = new \PharData( $this->filename, \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS, null, 2 ); return 1; } /** * {@inheritDoc} */ public function list(): array { $files = []; if ('' === $this->tar->getPathname()) { return $files; } $root_dir = dirname($this->tar->getPathname()); $source = new NoDotFilterIterator( new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($root_dir) ) ); foreach ($source as $file) { $files[] = [ 'filename' => str_replace($root_dir, '', $file->getPathname()), 'size' => $file->getSize(), ]; } return $files; } /** * {@inheritDoc} */ public function compress(string $source = '', array $files = []): bool { foreach ($files as $file) { $this->tar->addFile( $file, (string) str_replace( realpath($source) . '/', '', (string) realpath($file) ) ); } return true; } /** * {@inheritDoc} */ public function extractTo(string $target = '', array $files = []): bool { if (empty($files)) { $files = null; } return $this->tar->extractTo($target, $files); } /** * {@inheritDoc} */ public function remove(array $files = []): bool { foreach ($files as $file) { unset($this->tar[$file]); } return true; } /** * {@inheritDoc} */ public function close(): bool { return true; } /** * {@inheritDoc} */ public function setComment(string $comment): bool { return true; } /** * {@inheritDoc} */ public function getComment() { return ''; } }