2012-03-26 9 views
0

Ich verwende diese Funktion zip-Dateien zu generieren.zip Erzeugungsfunktion zu erzeugen leere Dateien

function create_zip($files = array(),$destination = '',$overwrite = false) { 
    //if the zip file already exists and overwrite is false, return false 
    if(file_exists($destination) && !$overwrite) { return false; } 
    //vars 
    $valid_files = array(); 
    //if files were passed in... 
    if(is_array($files)) { 
    //cycle through each file 
    foreach($files as $file) { 
     //make sure the file exists 
     if(file_exists($file)) { 
     $valid_files[] = $file; 
     } 
    } 
    } 
    //if we have good files... 
    if(count($valid_files)) { 
    //create the archive 
    $zip = new ZipArchive(); 
    if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
     return false; 
    } 
    //add the files 
    foreach($valid_files as $file) { 
     $zip->addFile($file,$file); 
     //echo $file; 
    } 
    //debug 
    //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status; 

    //close the zip -- done! 
    $zip->close(); 

    //check to make sure the file exists 
    echo $destination; 
    return file_exists($destination); 
    } 
    else 
    { 
    return false; 
    } 
} 

ich dies mit einem Vanille-zip, unveränderte Wordpress installieren (http://wordpress.org/) jedoch Aus irgendeinem Grund hat der Ordner wp-content eine leere Datei, die mit seinem Namen generiert wurde. Der Ordner (und alles andere) selbst wird korrekt komprimiert, aber die meisten unzip-Anwendungen (einschließlich php's eigener extractTo()) brechen, wenn sie diese unerwünschte Datei aufgrund des Namenskonflikts erreichen.

Ich habe in der Ordner/Datei-Struktur untersucht und soweit ich sehen kann, ist der einzige Unterschied zwischen diesem und den anderen Ordnern auf der Seite, dass es der größte bei 5,86 MB ist.

Kann jemand einen Fix/Workaround vorschlagen?

+0

Sie konnten die Zip-Funktion versuchen hier: http://stackoverflow.com/questions/1334613/how-to-recursively-zip-a-directory-in-php –

+0

Hat das Array $-Dateien enthalten nur Dateien oder auch Verzeichnisse? Vielleicht möchten Sie 'is_file' zu ​​Ihrer' file_exists' Prüfung hinzufügen. Und '$ zip-> addFile ($ file)' sollte ausreichen (belassen Sie den Parameter localname). – initall

+0

Gibt es etwas im Fehlerprotokoll? – piotrekkr

Antwort

0

Dies ist das Beispielbeispiel, um einen Ordner zu komprimieren.

 <?php 
     function Create_zipArch($archive_name, $archive_folder) 
     { 
      $zip = new ZipArchive; 
      if ($zip->open($archive_name, ZipArchive::CREATE) === TRUE) 
      { 
       $dir = preg_replace('/[\/]{2,}/', '/', $archive_folder . "/"); 

       $dirs = array($dir); 
       while (count($dirs)) 
       { 
        $dir = current($dirs); 
        $zip->addEmptyDir($dir); 

        $dh = opendir($dir); 
        while ($file = readdir($dh)) 
        { 
         if ($file != '.' && $file != '..') 
         { 
          if (is_file($file)) 
           $zip->addFile($dir . $file, $dir . $file); 
          elseif (is_dir($file)) 
           $dirs[] = $dir . $file . "/"; 
         } 
        } 
        closedir($dh); 
        array_shift($dirs); 
       } 

       $zip->close(); 
       $result='success'; 
      } 
      else 
      { 
       $result='failed'; 
      } 
      return $result; 
     } 

     $zipArchName = "ZipFileName.zip"; // zip file name 
     $FolderToZip = "zipthisfolder"; // folder to zip 

     echo Create_zipArch($zipArchName, $FolderToZip); 
     ?> 
Verwandte Themen