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 코드 실행에 허용 된 시간을 초과하지 않아야한다는 것입니다.