0

次の関数で tar アーカイブを作成しています

public static function packDirectory($path, $outpath) {
    require_once 'Archive/Tar.php';

    $obj = new Archive_Tar($outpath);
    $obj->setErrorHandling(PEAR_ERROR_PRINT);

    $handle=opendir($path);
    $files = array();

    while (false !== ($file = readdir($handle))) {
        if ($file == '.' || $file == '..') {
            continue;
        }

        $files[] = $path . '/' . $file;
    }

    $obj->create($files);
}

パスは のようなものfolder1/folder2/folder3/です。次のようなアーカイブを作成します

folder1/folder2/folder3/fileA
folder1/folder2/folder3/fileB
folder1/folder2/folder3/fileC
folder1/folder2/folder3/subfolder/fileD

そうであってほしい

fileA
fileB
fileC
subfolder/fileD

どのように行うことができますか?

4

1 に答える 1

0

createModify メソッドを使用する必要があります。これには、Archive_Tar の create メソッドよりも 2 つのパラメータが必要です。これら 3 つのパラメーターは次のとおりです。

  • $p_filelist - ファイル名の配列
  • $p_add_dir - ファイル名の先頭に追加される文字列/パス。
  • $p_remove_dir - ファイル名から削除する文字列/パス。

ファイル名から何を削除するかの 3 番目のパラメーターを含めるために、packDirectory メソッドを少し変更しました。次のようになります。

<?php
class Packer {

    public static function packDirectory($path, $outpath, $stripPath = '') {
        require_once 'Archive/Tar.php';

        $obj = new Archive_Tar($outpath);
        $obj->setErrorHandling(PEAR_ERROR_PRINT);

        $handle=opendir($path);
        $files = array();

        while (false !== ($file = readdir($handle))) {
            if ($file == '.' || $file == '..') {
                continue;
            }

            $files[] = $path . '/' . $file;
        }

        if ($stripPath === '') {
            $obj->create($files);
        } else {
            $obj->createModify($files, '', $stripPath);
        }
    }
}

Packer::packDirectory(
    "folder1/folder2/folder3", 
    "Packer.tar", 
    'folder1/folder2/folder3'
);
?>
于 2014-01-24T16:01:07.287 に答える