CakeFest 2024: The Official CakePHP Conference

PharData::extractTo

(PHP 5 >= 5.3.0, PHP 7, PHP 8, PECL phar >= 2.0.0)

PharData::extractTotar/zip アーカイブの内容をディレクトリに展開する

説明

public PharData::extractTo(string $directory, array|string|null $files = null, bool $overwrite = false): bool

tar/zip アーカイブ内のすべてのファイルをディスクに展開します。 展開されたファイルやディレクトリは、アーカイブに保存されたときのパーミッションを維持しています。 オプションのパラメータを使用すると、どのファイルを展開するかを制御したり 既存のファイルを上書きするかどうかを指定したりすることができます。 2 番目のパラメータ files には、 展開したいファイルやディレクトリの名前、あるいはその配列を指定します。 デフォルトでは、このメソッドは既存のファイルを上書きしません。 3 番目のパラメータを true にすると既存のファイルを上書きさせることができます。 このメソッドは ZipArchive::extractTo() と同じようなものです。

パラメータ

directory

指定した files の展開先のパス。

files

展開したいファイル名/ディレクトリ名、あるいはその配列。

overwrite

true にすると既存のファイルを上書きします。

戻り値

成功した場合に true を返します。 しかし、例外がスローされているかどうかを確認したうえで 例外がなければ成功とみなすほうがいいでしょう。

エラー / 例外

変更内容をディスクに書き込む際にエラーが発生した場合は PharException をスローします。

例1 PharData::extractTo() の例

<?php
try {
$phar = new PharData('myphar.tar');
$phar->extractTo('/full/path'); // すべてのファイルを展開します
$phar->extractTo('/another/path', 'file.txt'); // file.txt のみを展開します
$phar->extractTo('/this/path',
array(
'file1.txt', 'file2.txt')); // 2 つのファイルだけを展開します
$phar->extractTo('/third/path', null, true); // すべてのファイルを展開し、上書きします
} catch (Exception $e) {
// エラー処理
}
?>

注意

注意:

Windows の NTFS ファイルシステムには、ファイル名で使う場合にサポートしていない文字があります。具体的には、<|>*?": です。末尾にドットがあるファイル名もサポートしていません。いくつかの展開ツールと異なり、このメソッドはこれらの文字をアンダースコアで置き換えませんし、そのようなファイルを展開すると失敗します。

参考

  • Phar::extractTo() - phar アーカイブの内容をディレクトリに展開する

add a note

User Contributed Notes 2 notes

up
1
njh at aelius dot com
11 years ago
Note that PHAR only supports extracting the 'ustar' variant of the tar archives.

Some systems (such as older versions of Mac OS X) generate the 'pax' format by default.

See here for more information:
http://php.net/manual/pl/phar.fileformat.tar.php
up
1
Anonymous
6 years ago
I'm unable to extract the first directory from a tar archive:
the destination dir remains empty,
no error is thrown

<?php
$tar
= new \PharData('archive.tar');
if (
$tar->current()->isDir()) {
echo
'is_dir';
$dir = $tar->current()->getPathname();
$dir = basename($dir);
$tar->extractTo('destination', $dir);
}
?>

the docs hint that the second param could be a name of file OR DIR to be extracted from the archive, is that really possible?
To Top