@choupa
Архитектор (обычный, который строит)

Как зазиповать папку со всей структурой?

В папке 'xlsx' находят файлы и другие вложенные папки. Требуется

1. Зазиповать всё содержимое 'xlsx' мешком

2. при этом исключив из пути саму папку 'xlsx'. Т.е. открыв архив, мы должны видеть на верхнем уровне уже поддиректории и файлы, а не саму 'xlsx'.

Пока у меня получается поместить в архив только первый уровень вложенности и со вторым пунктом тоже никак Помогите правильно написать addGlob().

$xlsx_file = "calculation.xlsx";
$zip = new ZipArchive();
if ($zip->open($xlsx_file, ZipArchive::OVERWRITE) !== TRUE)
	$zip->open($xlsx_file, ZipArchive::CREATE);
$options = array('remove_path' => 'xlsx/');
$zip->addGlob("xlsx/*", 0, $options);
$zip->close();


Заранее спасибо.
  • Вопрос задан
  • 183 просмотра
Решения вопроса 1
@WestlE
class ExtendedZip extends ZipArchive {

    // Member function to add a whole file system subtree to the archive
    public function addTree($dirname, $localname = '') {
        if ($localname)
            $this->addEmptyDir($localname);
        $this->_addTree($dirname, $localname);
    }

    // Internal function, to recurse
    protected function _addTree($dirname, $localname) {
        $dir = opendir($dirname);
        while ($filename = readdir($dir)) {
            // Discard . and ..
            if ($filename == '.' || $filename == '..')
                continue;

            // Proceed according to type
            $path = $dirname . '/' . $filename;
            $localpath = $localname ? ($localname . '/' . $filename) : $filename;
            if (is_dir($path)) {
                // Directory: add & recurse
                $this->addEmptyDir($localpath);
                $this->_addTree($path, $localpath);
            }
            else if (is_file($path)) {
                // File: just add
                $this->addFile($path, $localpath);
            }
        }
        closedir($dir);
    }

    // Helper function
    public static function zipTree($dirname, $zipFilename, $flags = 0, $localname = '') {
        $zip = new self();
        $zip->open($zipFilename, $flags);
        $zip->addTree($dirname, $localname);
        $zip->close();
    }
}

// Example
ExtendedZip::zipTree('/foo/bar', '/tmp/archive.zip', ZipArchive::CREATE);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@choupa Автор вопроса
Архитектор (обычный, который строит)
Ответ на вопрос был бы конечно любопытен, но пока решил вопрос явным перечислением названий файлов и папок, благо их всего 13.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы