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

  • Gast-Avatar
    Ein Gast erstellte das Thema Zip entpacken, Hauptverzeichnis überspringen.

    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

  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    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

    Einen Kommentar schreiben:

Lädt...
X