2013-07-11 8 views
5

Ich habe einen Ordner mit einigen Dateien und Unterordner innerhalb. Wie werde ich das Verzeichnis lesen und den Hauptordner zippen?zip Hauptordner mit Unterordner innerhalb

Ex:

maindirectory 
--- file 1 
--- file 2 
--- subdirectory 1 
------ file 3 
------ file 4 
--- subdirectory 2 
------ file 5 
------ file 6 

Ich verwende dieses Skript:

function Zip($source, $destination, $include_dir = false) 
{ 

    if (!extension_loaded('zip') || !file_exists($source)) { 
     return false; 
    } 

    if (file_exists($destination)) { 
     unlink ($destination); 
    } 

    $zip = new ZipArchive(); 
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { 
     return false; 
    } 
    $source = str_replace('\\', '/', realpath($source)); 

    if (is_dir($source) === true) 
    { 

     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_CHILD); 

     if ($include_dir) { 

      $arr = explode("/",$source); 
      $maindir = $arr[count($arr)- 1]; 

      $source = ""; 
      for ($i=0; $i < count($arr) - 1; $i++) { 
       $source .= '/' . $arr[$i]; 
      } 

      $source = substr($source, 1); 

      $zip->addEmptyDir($maindir); 

     } 

     foreach ($files as $file) 
     { 
      $file = str_replace('\\', '/', $file); 

      // Ignore "." and ".." folders 
      if(in_array(substr($file, strrpos($file, '/')+1), array('.', '..'))) 
       continue; 

      $file = realpath($file); 

      if (is_dir($file) === true) 
      { 
       $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); 
      } 
      else if (is_file($file) === true) 
      { 
       $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); 
      } 
     } 
    } 
    else if (is_file($source) === true) 
    { 
     $zip->addFromString(basename($source), file_get_contents($source)); 
    } 

    return $zip->close(); 
} 

und ich rufe die Funktion wie folgt aus:

Zip('image/data/','aaa.zip',false); 

Aber was ich bekommen, ist es zip der ganze C: Ordner. Ich möchte nur das Dokument im Ordner image/data/ zippen.

Wie kann ich das richtige Verzeichnis und seine Unterverzeichnisse formatieren?

Antwort

5

versuchen Sie dies.

zipFile('image/data/','aaa.zip', true); 

/** 
* function zipFile. Creates a zip file from source to destination 
* 
* @param string $source Source path for zip 
* @param string $destination Destination path for zip 
* @param string|boolean $flag OPTIONAL If true includes the folder also 
* @return boolean 
*/ 
function zipFile($source, $destination, $flag = '') 
{ 
    if (!extension_loaded('zip') || !file_exists($source)) { 
     return false; 
    } 

    $zip = new ZipArchive(); 
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { 
     return false; 
    } 

    $source = str_replace('\\', '/', realpath($source)); 
    if($flag) 
    { 
     $flag = basename($source) . '/'; 
     //$zip->addEmptyDir(basename($source) . '/'); 
    } 

    if (is_dir($source) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 
     foreach ($files as $file) 
     { 
      $file = str_replace('\\', '/', realpath($file)); 

      if (is_dir($file) === true) 
      { 
       $zip->addEmptyDir(str_replace($source . '/', '', $flag.$file . '/')); 
      } 
      else if (is_file($file) === true) 
      { 
       $zip->addFromString(str_replace($source . '/', '', $flag.$file), file_get_contents($file)); 
      } 
     } 
    } 
    else if (is_file($source) === true) 
    { 
     $zip->addFromString($flag.basename($source), file_get_contents($source)); 
    } 

    return $zip->close(); 
} 
+1

1 Tausend Dank – AtanuCSE

+0

Können Sie warum '$ flag' erklären? Ich arbeite mit vollen Pfaden und habe einen kleinen Fehler (das erste Verzeichnis ist leer und zeigt den vollständigen ursprünglichen Pfad). – brasofilo

+0

@brasofilo '$ flag' enthält hier das Basisverzeichnis, hier werden alle Dateien und Ordner von' 'image/data /' 'innerhalb des 'data'-Verzeichnisses gepackt. –

1

Danke Jungs ... ich meine, das Problem alr out ...

if (is_dir($source) === true) 
{ 
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 
    foreach ($files as $file) 
    { 
     $file = str_replace('\\', '/', realpath($file)); 

     if (is_dir($file) === true) 
     { 
      //$zip->addEmptyDir(str_replace($source . '/', '', $flag.$file . '/')); //this should be commented so it wont include the main path 
     } 
     else if (is_file($file) === true) 
     { 
      $zip->addFromString(str_replace($source . '/', '', $flag.$file), file_get_contents($file)); 
     } 
    } 
} 
0
 1- You should put all these code in a function 
     function readfile($source){ 
      if (is_dir($source) === true) {      
      $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 
       foreach ($files as $file) 
      { 
     $file = str_replace('\\', '/', realpath($file)); 

     if (is_dir($file) === true) 
     { 
      $zip->addEmptyDir(str_replace($source . '/', '', $flag.$file . '/')); 
     } 
     else if (is_file($file) === true) 
     { 
      $zip->addFromString(str_replace($source . '/', '', $flag.$file), file_get_contents($file)); 
     } 
    } 
} 
else if (is_file($source) === true) 
{ 
    $zip->addFromString($flag.basename($source), file_get_contents($source)); 
} 
    // here you would use recursive function 
    else if (is_dir($source) === true) 
{ 
    readfile($source); 
} 
} 

Zusammenfassung: wenn Sie eine Datei finden, dann würden Sie Betrieb tun, was Sie wollen und wenn Sie Suchen Sie ein Verzeichnis, in dem Sie die rekursive Funktion zum Durchlaufen des Verzeichnisses verwenden möchten.

2

Ich habe das obige Code, da ich nicht in der Lage war, leere Ordner hinzufügen und die C zu vermeiden: Fahren Sie auch

$otpt = "C:/xampp/htdocs/restricted/abc.zip"; 
$inpt = "C:/xampp/htdocs/Test/"; 


zipFile($inpt,$otpt, true); //Call to function 

function zipFile($source, $destination, $flag = '') 
{ 
    if (!extension_loaded('zip') || !file_exists($source)) { 
     return false; 
    } 

    $zip = new ZipArchive(); 
    if (!$zip->open($destination, ZIPARCHIVE::CREATE)) { 
     return false; 
    } 

    $source = str_replace('\\', '/', realpath($source)); 
    if($flag) 
    { 
     $flag = basename($source) . '/'; 
    } 

    if (is_dir($source) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($source), RecursiveIteratorIterator::SELF_FIRST); 

     foreach ($files as $file) 
     { 

      $file = str_replace('\\', '/', realpath($file)); 

      if (strpos($flag.$file,$source) !== false) { // this will add only the folder we want to add in zip 

       if (is_dir($file) === true) 
       { 
        $zip->addEmptyDir(str_replace($source . '/', '', $flag.$file . '/')); 

       } 
       else if (is_file($file) === true) 
       { 
        $zip->addFromString(str_replace($source . '/', '', $flag.$file), file_get_contents($file)); 
       } 
      } 
     } 
    } 
    else if (is_file($source) === true) 
    { 
     $zip->addFromString($flag.basename($source), file_get_contents($source)); 
    } 

    return $zip->close(); 
} 
0

Sie hinzufügen sollten:

if(basename($file) === '.' || basename($file) === '..'){ 
    continue; 
} 

wie folgt aus:

0

Es wird einfacher und wenn Sie die Addfile-Methode anstelle von addfromstring

012 verwenden

für Sieg

public function ArchiveFile($path) 
    { 

     $path=realpath($path); 

     $zip = new \ZipArchive(); 
     $path= str_replace('/','\\', $path); 

     $nameFile = $path.'\\'.'letter'.time().'.zip'; 

     if ($zip->open($nameFile,\ZipArchive::CREATE)===TRUE){  




     if (is_dir($path)) 
     { 
      $pathSource= $path. '\\'; 
     $directory = new \RecursiveDirectoryIterator($path); 
     $files = new \RecursiveIteratorIterator($directory, \RecursiveIteratorIterator::SELF_FIRST); 
     } 




     foreach ($files as $name=>$file) 
     { 


      if (in_array(substr($name, strrpos($name,'\\')+1), array('.','..'))) 
      { 
       continue; 
      } 

     if  (is_file($name)===TRUE) { 

      $zip->addFile($name, str_replace($pathSource, "", $name)); 
      } 

     } 


      $zip->close(); 


     rename($nameFile, $nameFile.'.xlsx'); 
+0

Können Sie Ihrer Antwort ein kurzes Beispiel für OP hinzufügen? – roelofs

Verwandte Themen