2010-06-22 2 views
2

위치에 zip 폴더의 압축을 풀고 일부 파일을 제외한 모든 파일 및 폴더를 대체하려면 어떻게해야합니까?ZipArchive에서 특정 파일 및 폴더를 덮어 쓰지 않게하는 방법

현재 다음을 수행합니다.

$backup = realpath('./backup/backup.zip'); 

$zip = new ZipArchive(); 

if ($zip->open("$backup", ZIPARCHIVE::OVERWRITE) !== TRUE) { 

    die ('Could not open archive'); 

} 

$zip->extractTo('minus/'); 

$zip->close(); 

어떤 파일과 폴더를 대체하지 말아야하는지에 대한 조건을 어떻게 넣을 수 있습니까? 어떤 종류의 루프를 사용할 수 있다면 좋을 것입니다.

덕분에 어떤 도움 당신은 이런 일을 할 수

답변

7

에 대한 모든, 나는 그것을 테스트하고 나를 위해 작동합니다

// make a list of all the files in the archive 
$entries = array(); 
for ($idx = 0; $idx < $zip->numFiles; $idx++) { 
    $entries[] = $zip->getNameIndex($idx); 
} 

// remove $entries for the files you don't want to overwrite 

// only extract the remaining $entries 
$zip->extractTo('minus/', $entries); 

이 솔루션은 numFiles 속성을하고 getNameIndex 방법을 기반으로 아카이브가 하위 폴더로 구성되어있는 경우에도 작동합니다 (항목은 /folder/subfolder/file.ext처럼 보입니다). 또한 extractTo 메서드는 추출 할 파일 목록을 보유하는 두 번째 선택적 매개 변수를 사용합니다.

+0

빌어 먹을 빅터! 당신은 나를 펀치로 때렸다. :). +1 깨끗한 솔루션입니다. –

+0

PHP를 한 지 수년이 지났습니다. "if ($ zip-> numFiles> 0)"를 확인해야합니까? –

+0

@Andre : 실제로, 실제로는 아니야, 뭔가를 추측하기 전에 확인하는 습관 일뿐입니다. 나는 코드를 조금 짧게했다. –

0

아카이브에서 특정 파일을 추출하려는 경우 (그리고 그 내용을 알고 있다면) 두 번째 매개 변수 (항목)를 사용하십시오.

$zip->extractTo('minus/', array('file1.ext', 'newfile2.xml')); 

존재하지 않는 모든 파일을 추출 할 경우, 다음 중 하나를 시도 할 수 있습니다 :

$files = array(); 

for($i = 0; $i < $zip->numFiles; $i++) { 
    $filename = $zip->getNameIndex($i); 
    // if $filename not in destination/or whatever the logic is then 
     $files[] = $filename; 
} 
$zip->extractTo($path, $files);  
$zip->close(); 

당신은 또한 당신이 다음에 쓰기 스트림을 읽을 $zip->getStream($filename)을 사용할 수 있습니다 목적지 파일.

관련 문제