php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 05.11.2005, 12:19  
Gast
 
Beiträge: n/a
Standard 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
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 06.11.2005, 14:28  
Gast
 
Beiträge: n/a
Standard

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
 
Alt 06.11.2005, 17:03  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Bin nicht ganz sicher was du meinst, aber entpacks doch normal und verschieb es danach ins richtige Ordner-Format?
Zergling-new ist offline  
Alt 06.11.2005, 21:12  
Gast
 
Beiträge: n/a
Standard

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
 
Alt 11.11.2005, 00:23  
Gast
 
Beiträge: n/a
Standard

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
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
zLib mit Passwort entpacken? GSJLink PHP-Fortgeschrittene 4 02.03.2008 12:58
.gz Datei entpacken und mit dem Inhalt weiterarbeiten R4v3r PHP Tipps 2007 8 02.02.2007 14:49
Dateien entpacken (GZIP) PHP Tipps 2006 2 26.01.2006 13:46
Datei im Hauptverzeichnis speichern lomtas PHP Tipps 2005-2 6 20.06.2005 13:16
Zip-File entpacken Juuro PHP Tipps 2005-2 10 07.06.2005 22:26
WinZip-Datei mit PHP entpacken PHP-Fortgeschrittene 1 05.06.2005 16:15
[Erledigt] Große .gz Datei entpacken PHP-Fortgeschrittene 7 03.06.2005 11:17
Zip Datei hochladen und entpacken PHP-Fortgeschrittene 3 02.05.2005 22:35
zm9 (Zip Datei) Hochladen und mit PHP entpacken! PHP Tipps 2005 3 25.04.2005 00:31
*.tar.gz per php ohne ziplib entpacken? PHP Tipps 2005 2 15.04.2005 19:40
Dateien entpacken msdose PHP Tipps 2005 6 22.02.2005 11:04
entpacken von Datein macht Probleme PHP-Fortgeschrittene 2 23.12.2004 16:58
[Erledigt] entpacken einer datei PHP-Fortgeschrittene 11 25.11.2004 16:16
tar.gz entpacken mit zlib oder shell_exec() PHP-Fortgeschrittene 3 04.11.2004 17:53

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php ziparchive password, fwrite php entpacken umbenennen, zip ins hauptverzeichnis entpacken, zip datei in hauptordner entpacken, php ordner überspringen, \php\ \zip-archiv\ \passwort\ auslesen fwrite, zip verzeichnisse auslassen, hauptverzeichnis entpacken, php entpacken im hauptverzeichnis, zip entpacken ohne ordner, im hauptverzeichnis entpacken, zip archive überspringen, zip -r verzeichnis auslassen, php zip entpacken, php zip entpacken hauptordner, linux hauptverzeichnisse erklärung, php zip upload ordner abfangen, php zip entpacken ersetzen, zip $comp_meth == \'stored\', winzip packen verzeichnis überspringen

Alle Zeitangaben in WEZ +1. Es ist jetzt 17:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.