[php] PHP를 사용하여 전체 폴더를 압축하는 방법

stackoveflow에서 특정 파일을 압축하는 방법에 대한 일부 코드를 찾았지만 특정 폴더는 어떻습니까?

Folder/
  index.html
  picture.jpg
  important.txt

안에는 My Folder파일이 있습니다. 압축을 풀고 나면를 My Folder제외한 폴더의 전체 내용을 삭제하고 싶습니다 important.txt.

이것을 스택 에서 찾았습니다.

당신의 도움이 필요합니다. 감사.



답변

2015/04/22 코드가 업데이트되었습니다.

전체 폴더를 압축하십시오.

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);
    }
}

// Zip archive will be created only after closing object
$zip->close();

전체 폴더를 압축하고 “important.txt”를 제외한 모든 파일을 삭제하십시오.

// Get real path for our folder
$rootPath = realpath('folder-to-zip');

// Initialize archive object
$zip = new ZipArchive();
$zip->open('file.zip', ZipArchive::CREATE | ZipArchive::OVERWRITE);

// Initialize empty "delete list"
$filesToDelete = array();

// Create recursive directory iterator
/** @var SplFileInfo[] $files */
$files = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($rootPath),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($files as $name => $file)
{
    // Skip directories (they would be added automatically)
    if (!$file->isDir())
    {
        // Get real and relative path for current file
        $filePath = $file->getRealPath();
        $relativePath = substr($filePath, strlen($rootPath) + 1);

        // Add current file to archive
        $zip->addFile($filePath, $relativePath);

        // Add current file to "delete list"
        // delete it later cause ZipArchive create archive only after calling close function and ZipArchive lock files until archive created)
        if ($file->getFilename() != 'important.txt')
        {
            $filesToDelete[] = $filePath;
        }
    }
}

// Zip archive will be created only after closing object
$zip->close();

// Delete all files from "delete list"
foreach ($filesToDelete as $file)
{
    unlink($file);
}


답변

ZipArchive 클래스에는 유용한 문서화되지 않은 메소드가 있습니다. addGlob ();

$zipFile = "./testZip.zip";
$zipArchive = new ZipArchive();

if ($zipArchive->open($zipFile, (ZipArchive::CREATE | ZipArchive::OVERWRITE)) !== true)
    die("Failed to create archive\n");

$zipArchive->addGlob("./*.txt");
if ($zipArchive->status != ZIPARCHIVE::ER_OK)
    echo "Failed to write files to zip\n";

$zipArchive->close();

이제 www.php.net/manual/en/ziparchive.addglob.php에 문서화되어 있습니다.


답변

이 시도:

$zip = new ZipArchive;
$zip->open('myzip.zip', ZipArchive::CREATE);
foreach (glob("target_folder/*") as $file) {
    $zip->addFile($file);
    if ($file != 'target_folder/important.txt') unlink($file);
}
$zip->close();

이것은 하지 않습니다 재귀하지만 압축.


답변

나는 이것이 zip 응용 프로그램이 검색 경로에있는 서버에서 실행되고 있다고 가정합니다. 모든 유닉스 기반에 해당해야하며 대부분의 Windows 기반 서버를 추측합니다.

exec('zip -r archive.zip "My folder"');
unlink('My\ folder/index.html');
unlink('My\ folder/picture.jpg');

아카이브는 나중에 archive.zip에 있습니다. 파일 또는 폴더 이름의 공백은 오류의 일반적인 원인이며 가능한 경우 피해야합니다.


답변

아래 코드로 시도해 보았습니다. 코드는 설명이 필요하므로 질문이 있으면 알려주십시오.

<?php
class FlxZipArchive extends ZipArchive
{
 public function addDir($location, $name)
 {
       $this->addEmptyDir($name);
       $this->addDirDo($location, $name);
 }
 private function addDirDo($location, $name)
 {
    $name .= '/';
    $location .= '/';
    $dir = opendir ($location);
    while ($file = readdir($dir))
    {
        if ($file == '.' || $file == '..') continue;
        $do = (filetype( $location . $file) == 'dir') ? 'addDir' : 'addFile';
        $this->$do($location . $file, $name . $file);
    }
 }
}
?>

<?php
$the_folder = '/path/to/folder/to/be/zipped';
$zip_file_name = '/path/to/zip/archive.zip';
$za = new FlxZipArchive;
$res = $za->open($zip_file_name, ZipArchive::CREATE);
if($res === TRUE)
{
    $za->addDir($the_folder, basename($the_folder));
    $za->close();
}
else{
echo 'Could not create a zip archive';
}
?>


답변

이것은 전체 폴더와 그 내용을 zip 파일로 압축하는 함수이며 다음과 같이 간단하게 사용할 수 있습니다.

addzip ("path/folder/" , "/path2/folder.zip" );

함수 :

// compress all files in the source directory to destination directory 
    function create_zip($files = array(), $dest = '', $overwrite = false) {
    if (file_exists($dest) && !$overwrite) {
        return false;
    }
    if (($files)) {
        $zip = new ZipArchive();
        if ($zip->open($dest, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {
            return false;
        }
        foreach ($files as $file) {
            $zip->addFile($file, $file);
        }
        $zip->close();
        return file_exists($dest);
    } else {
        return false;
    }
}

function addzip($source, $destination) {
    $files_to_zip = glob($source . '/*');
    create_zip($files_to_zip, $destination);
    echo "done";
}


답변

EFS PhP-ZiP MultiVolume Script를 사용해보십시오. … 수백 개의 공연과 수백만 개의 파일을 압축하여 전송했습니다 … 효과적으로 아카이브를 만들려면 ssh가 필요합니다.

그러나 결과 파일을 PHP에서 직접 exec와 함께 사용할 수 있다고 믿습니다.

exec('zip -r backup-2013-03-30_0 . -i@backup-2013-03-30_0.txt');

작동하는지 모르겠습니다. 나는 시도하지 않았다 …

“비밀”은 아카이빙 실행 시간이 PHP 코드 실행에 허용 된 시간을 초과하지 않아야한다는 것입니다.