Ankündigung

Einklappen
Keine Ankündigung bisher.

Zip entpacken, Hauptverzeichnis überspringen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Zip entpacken, Hauptverzeichnis überspringen

    Hallo,

    ich möchte beim entpacken einer Zipdatei einen Ordner überspringen, falls er zuviel sein sollte.

    Folgendes Problem. Ich habe festgestellt, daß es zwei Arten gibt wie Zipdateien erstellt werden. Also wie ein Zipprogramm die Ordnerstruktur erstellt. Als Beispiel mal folgende Ordnerstruktur (vor dem packen): Hauptverzeichnis /ueber und im Hauptverzeichnis befinden sich die Unterverzeichnisse /untereins und /unterzwei. Wenn ich das Hauptverzeichnis jetzt zippe (ueber.zip) und anschließend wieder entzippe, habe ich auf der Festplatte nur noch /untereins und /unterzwei. /ueber wird nicht angelegt. Ich kann ueber.zip auch umbenennen in ueberneu.zip, /ueber wird trotzdem nicht angelegt (so soll es ürigens auch sein). Jetzt gibt es aber auch Zipdateien (habe hier welche aus dem Internet) da wird /ueber angelegt, auch wenn man ueber.zip in ueberneu.zip umbenennt. Wenn ich mit PHP entpacke passiert das selbe, muß also an den Zipdateien selbst liegen.

    Mit folgendem Script erstelle ich im Uploadverzeichnis einen Ordner aus dem Namen der Zipdatei und entpacke die sie darin.

    PHP-Code:
    <?PHP

    $modul_path 
    "Pfad_auf_der_Festplatte";
    $max_size 5000000;

    if (
    $zipfile != "")
    {
        if ((isset(
    $_FILES['zipfile'])) && ($_FILES['zipfile']['size']<=$max_size))
        {
            
    $zipfilename $_FILES['zipfile']['name'];
            
    $newfolder str_replace(substr($filterfilenamestrrpos($filterfilename'') - 4), ""$filterfilename);
                
            if(!empty(
    $zipfilename)) 
            { 
                
    $dat substr($zipfilenamestrrpos($zipfilename'.') + 1);
                if (
    $dat != "zip")
                {    
                    
    $msg $zipfilename." ist kein Zip Archiv!";
                }
                else
                {
                    
    $searchfolder $modul_path."/".$newfolder;
                    
                    if (
    file_exists($searchfolder))
                    {
                        
    $msg $newfolder." existiert bereits!";
                    }
                    else
                    {
                        
    mkdir($searchfolder0777);
                    
                        if (
    move_uploaded_file($_FILES['zipfile']['tmp_name'],$modul_path."/".$_FILES['zipfile']['name'])) 
                        {
                            
    $zip_datei $modul_path."/".$zipfilename;
                            
    $ziel_ordner $searchfolder."/";
                        
                            if (
    file_exists($zip_datei) && ($zip zip_open($zip_datei)))
                            {
                                while(
    $zip_entry zip_read($zip))
                                {
                                    
    $file_name zip_entry_name($zip_entry);
                                    
    $file_size zip_entry_filesize($zip_entry);
                                    
    $comp_meth zip_entry_compressionmethod($zip_entry);
                            
                                    if (
    $file_name == $newfolder."/")
                                    {
                                        
    $ziel_ordner $modul_path."/";
                                    }
                                    
                                    if (
    zip_entry_open($zip$zip_entry'rb'))
                                    {
                                        
    $buffer zip_entry_read($zip_entry$file_size);
                        
                                        if (
    preg_match('/\/$/'$file_name) && ($comp_meth == 'stored'))
                                        {
                                            if (!
    is_dir($ziel_ordner.$file_name))
                                                @
    mkdir($ziel_ordner $file_name0777);
                                        }
                                        else
                                        {
                                            
    $fp fopen($ziel_ordner $file_name'wb');
                                            
    fwrite($fp$buffer);
                                            
    fclose($fp);
                                        }
                                        
    zip_entry_close($zip_entry);
                                    }
                                }
                                
    zip_close($zip);
                            }

                            if (
    unlink($zip_datei))
                            {
                                
    $msg $newfolder." wurde angelegt, das ZIP-Archiv wurde gelöscht!";
                            }
                        }
                    }
                }
            }
        }
        else
        {
            
    $msg "Das ZIP-Archiv ist zu groß";
        }
    }

    echo 
    $msg;

    ?>
    Mit meinen Zips gibt es keine Probleme, egal ob Orginalname oder umbenannt. Bei den Zips aus dem Internet umgehe ich mit <--if($file_name == $newfolder."/")-->, daß /ueber angelegt wird. Bleibt noch das Problem, wenn ueber.zip in ueberneu.zip umbenannt wurde. Es müste geprüft werden, ob das erste Verzeichnis in der Zipdatei ein Singelverzeichnis ist oder ob es weitere Verzeichnisse bzw. Dateien gibt. Damit bin ich allerdings überfordert Weiß jemand wie das geht?

    Gruß Sven


  • #2
    Keiner 'ne Idee? Kann doch nicht so schwer sein (wenn man es kann). $zip_entry müste ein Array sein und dort muß man doch irgendwie die Struktur abfragen können. Die weitere Vorgehensweise wäre klar:
    PHP-Code:
    <?php
    if ($file_name == $newfolder."/"

        
    $ziel_ordner $modul_path."/"

    elseif (
    ARRAYABFRAGE_NACH_SINGELORDNER

        
    unlink($ziel_ordner);
        
    $ziel_ordner $modul_path."/"


    # und nach dem entpacken

    rename($modul_path."/".SINGELORDNER$searchfolder);
    ?>
    Wie könnte so eine Abfrage aussehen?

    Gruß Sven

    Kommentar


    • #3
      Bin nicht ganz sicher was du meinst, aber entpacks doch normal und verschieb es danach ins richtige Ordner-Format?

      Kommentar


      • #4
        Ich glaube das bringt mich nicht weiter. Nochmal zur Erklärung, ich entpacke eine Zipdatei nach /zipordner:

        erste Möglichkeit -> in /zipordner werden 3 Verzeichnise und 5 Dateien angelegt
        zweite Möglichkeit -> in /zipordner wird ein Hauptverzeichnis erstellt und in diesem Verzeichnis 3 weitere Verzeichnise und 5 Dateien

        Das muß am Zipprogramm liegen mit dem die Zipdatei erstellt wurde, vielleicht auch am Betriebssystem (MAC/Linux).

        Ich bräuchte jetzt eine Funktion oder sowas die nachschaut, ob es ein Hauptverzeichnis in der Zipdatei gibt oder nicht. Dann käme ich weiter.


        Gruß Sven

        Kommentar


        • #5
          Ich habe es hinbekommen. Falls es mal jemand gebrauchen kann, hier die Lösung. Die Zeile $ziel_ordner = $searchfolder."/"; löschen und durch folgenden Code ersetzen:
          PHP-Code:
          <?php
          if (file_exists($zip_datei) && $folders zip_open($zip_datei)) {

              
          $zipfolders = array();
              while(
          $zip_entry zip_read($folders)) {
              
                  
          $file_name zip_entry_name($zip_entry);
                  
          $comp_meth zip_entry_compressionmethod($zip_entry);
                  
                  if (
          zip_entry_open($folders$zip_entry'rb'))
                  {                        
                      if (
          preg_match('/\/$/'$file_name) && ($comp_meth == 'stored'))
                      {
                          if (
          $file_name != "." && $file_name != "..")
                          {
                              
          $abfrage explode("/"$file_name);
                              
          $letzter $abfrage[0];
                              
          $zipfolders[] = $abfrage[0];
                          }
                      }
                      
          zip_entry_close($zip_entry);
                  }
              }
              
          zip_close($folders);

              
          $erster $zipfolders[0];
              if(
          $erster == $letzter)
              {
                  
          rmdir($searchfolder);
                  
          $rename true;
                  
          $ziel_ordner $modul_path."/";
              }
              else
              {
                  
          $ziel_ordner $searchfolder."/";
              }
          }
          ?>
          Damit wird die Zipdatei ausgelesen und alle Hauptordner werden in das Array $zipfolders geschrieben. Die Variable $letzter wird zum letzten Schleifendurchlauf überschrieben, enthält also den letzten Ordner. $erster holt den ersten Ordner aus dem Array. Jetzt wird verglichen und entsprechend fortgefahren. Dann noch
          PHP-Code:
          <?php
          if ($file_name == $newfolder."/"

              
          ziel_ordner $modul_path."/"

          ?>
          löschen und in if (unlink($zip_datei)) folgenden Code einfügen:
          PHP-Code:
          <?php
          if($rename)
          {
              
          $orgfolder $modul_path."/".$erster;
              
          rename($orgfolder$searchfolder);
          }
          ?>
          Gruß Sven

          Kommentar

          Lädt...
          X