File_Archive バージョン 1.3 では、既存のアーカイブを編集するための関数が新たに追加されました。 これらの関数を使用すると、既存のアーカイブからファイルを削除したり アーカイブにファイルを追加したりできるようになります。
File_Archive においては ファイルシステムは単なるリーダー/ライターであり、 変更内容を "実際の" アーカイブ (実際のファイル) に書き込んだりネストしたアーカイブ (別のアーカイブの内部にあるアーカイブ) に書き込んだりすることができます。
ファイルをアーカイブから削除するには、 File_Archive クラスの以下の関数のいずれかを使用します。
remove
(
&$pred
, $URL
)
指定した条件を満たすすべてのファイルを
$URL
から削除します。
URL は File_Archive::read() 関数と同じ形式のものです。
ネストしたアーカイブも使用することができます。
removeFromSource
(
&$pred
, &$source
, $URL = null
)
remove と同じですが、デフォルトのファイルシステムリーダーではなく
$source
を使用します。URL を省略した場合は
$source
がアーカイブでなければなりません。
ファイルはここから削除されます。
removeDuplicates
(
$URL
)
この関数は、$URL
で指定したアーカイブから
重複しているファイルを削除します。直近のファイルのみを残します。
ファイルの更新時刻が記録されていない場合は、 一番古いものとみなします。
ふたつのファイルの更新時刻が同じ場合は、 アーカイブ内での位置がもっとも上にあるもの (通常は一番最後に追加したもの) を残します。
removeDuplicatesFromSource
(
&$source
, $URL = null
)
removeDuplicate() と同じですが、
デフォルトのファイルシステムリーダーではなく
$source
を使用します。URL を省略した場合は
$source
がアーカイブでなければなりません。
これらの関数は、アーカイブの圧縮解除を再帰的には行わないことに注意しましょう。
zip アーカイブからの jpg、gif そして bmp ファイルの削除
<?php
require_once "File/Archive.php";
File_Archive::remove(
File_Archive::predExtension(
array('jpg', 'jpeg', 'bmp', 'gif')
),
'archive.zip'
);
?>
ネストしたアーカイブからの画像ファイルの削除
<?php
require_once 'File/Archive.php';
File_Archive::remove(
File_Archive::predMIME(
array('image/*')
),
'archive.zip/data.tgz'
);
?>
ファイルをアーカイブに追加するには、 File_Archive クラスの以下の関数のいずれかを使用します。
appender
(
$URL
, $unique = null
, $type = null
, $stat = array()
)
URL で指定したアーカイブに追加します。
unique が true
の場合は、アーカイブ内に
同じ名前のファイルがあればそれが削除されます。
null
の場合はデフォルト設定 (変更するには
File_Archive::setOption('appendRemoveDuplicates', true/false))
を使用します (デフォルトは false
です)。
アーカイブが存在しない場合は、指定したパラメータ (型が指定されていない場合は URL の拡張子で判断します) と stat 配列を使用して作成します。
appenderFromSource
(
&$source
, $URL = null
, $unique = null
, $type = null
, $stat = array()
)
appender と同じですが、デフォルトのファイルシステムリーダーではなく
$source
を使用します。
これらの関数はいずれも、ライターを返します。 これは、先ほどのように extract 関数で使用することができます。
アーカイブへのフォルダの追加
<?php
require_once "File/Archive.php";
File_Archive::extract(
File_Archive::read('folder'),
File_Archive::appender('archive.zip')
);
?>
ライターではなく文字列を関数で使用した場合は、 File_Archive::appender() で文字列が変換されることに注意しましょう。 したがって、先ほどの例はこのように書き直すこともできます。
アーカイブへのフォルダの追加
<?php
require_once "File/Archive.php";
File_Archive::extract(
$src = 'folder',
$dest= 'archive.zip'
);
?>