PHP 8.4.2 Released!

RarEntry::extract

(PECL rar >= 0.1)

RarEntry::extractアーカイブのエントリを展開する

説明

public RarEntry::extract(
    string $dir,
    string $filepath = "",
    string $password = NULL,
    bool $extended_data = false
): bool

RarEntry::extract() は、エントリのデータを展開します。 二番目の引数が指定されていなければ、 指定した dir にエントリの名前と同名の新しいファイルを作成します。 詳細は以下を参照ください。

パラメータ

dir

ファイルを展開するディレクトリへのパス。 このパラメータが考慮されるのは filepath が指定されていないときだけです。両方のパラメータが空の場合は、 カレントディレクトリへの展開を試みます。

filepath

取り出すファイルのディレクトリとファイル名を含むパス (相対パスあるいは絶対パス)。 このパラメータは、dir の内容と元のファイル名を両方とも上書きします。

password

このエントリの暗号化に使うパスワード。 エントリが暗号化されていない場合は、この値は使われずに無視されます。 このパラメータが省略されていてエントリが暗号化されていた場合は、もし rar_open() でパスワードを指定していればそれを使います。 このパラメータや rar_open() で指定したパスワードが間違っていたときは、 CRC チェックが失敗してこのメソッドが失敗し、false を返します。 パスワードが要求されているときにパスワードを指定していなければ、 このメソッドは失敗して false を返します。 エントリが暗号化されているかどうかを知るには RarEntry::isEncrypted() を使います。

extended_data

true にすると、NTFS の ACL や Unix のオーナー情報といった拡張情報が アーカイブに設定されていれば、取り出したファイルにもそれを設定します。

警告

バージョン 2.0.0 より前は、この関数では相対パスを正しく扱えません。 回避策として realpath() を使いましょう。

戻り値

成功した場合に true を、失敗した場合に false を返します。

変更履歴

バージョン 説明
PECL rar 3.0.0 extended_data が追加されました。
PECL rar 3.0.0 エントリ名が繰り返される RAR アーカイブも対応するようになりました。

例1 RarEntry::extract() の例

<?php

$rar_file
= rar_open('example.rar') or die("Rar アーカイブのオープンに失敗しました");

$entry = rar_entry_get($rar_file, 'Dir/file.txt') or die("そのようなエントリは見つかりません");

$entry->extract('/dir/to'); // /dir/to/Dir/file.txt を作成します
$entry->extract(false, '/dir/to/new_name.txt'); // /dir/to/new_name.txt を作成します

?>

例2 アーカイブ内のすべてのファイルを展開する方法

<?php

/* erix こと Erik Jenssen によるサンプルです */

$filename = "foobar.rar";
$filepath = "/home/foo/bar/";

$rar_file = rar_open($filepath.$filename);
$list = rar_list($rar_file);
foreach(
$list as $file) {
$entry = rar_entry_get($rar_file, $file);
$entry->extract("."); // カレントディレクトリに展開します
}
rar_close($rar_file);

?>

参考

add a note

User Contributed Notes 2 notes

up
7
nelson_km_94 at hotmail dot com
9 years ago
Example #2 has a mistake.

This one works fine:
<?php

/* example by Erik Jenssen aka erix */

$filename = "foobar.rar";
$filepath = "/home/foo/bar/";

$rar_file = rar_open($filepath.$filename);
$list = rar_list($rar_file);
foreach(
$list as $file) {
$entry = rar_entry_get($rar_file, $file->getName());
$entry->extract("."); // extract to the current dir
}
rar_close($rar_file);

?>
up
0
Anonymous
11 years ago
If the entry to extract is a directory as per RarEntry::isDirectory(), this method does not seem to extract the entries below that directory as one might expect from using the command-line RAR or WinRAR.
To Top