.tar Archive entpacken

visiondpc

Erfahrenes Mitglied
Hallo,
ich wollte mich mal an das entpacken von tar-Archiven machen und habe mich dafür in dieses Tutorial eingelesen.

http://www.tutorials.de/forum/php-tutorials/215261-dekompression-mit-php.html

Bei den ersten Versuchen ist mir recht schnell aufgefallen, dass der im Tutorial beschriebene String ustar im Archiv garnicht vorhanden ist.
Liegt das jetzt an meiner Software (ich hab dafür jetzt PeaZip benutzt) oder hat sich an den Eigenschaften von tar-Archiven etwas geändert? Das Tut ist ja auch schon etwas älter.
Falls letzteres zutrifft, wie finde ich dann heraus, was der Infoblock ist?
 
Seltsam, dann scheint es wohl an dem Programm zu liegen.
Ich hab so eine Datei mal angehängt. Die muss natürlich vorher entzipt werden weil tar als Dateiendung für Anhänge nicht erlaubt ist.


edit: Ich hab es jetzt nochmal mit einer anderen Software (7z) versucht, da ist es das gleiche Ergebnis. Kein ustar im ganzen Dokument.
 

Anhänge

Zuletzt bearbeitet:
hm, da darin kein ustar enthalten is, würd i wohl mal sagen das des Programm da nix von reinschreibt...nur scheint mir, da winzip das anstandslos öffnet, auch nicht all zu wichtig
 
Wenn ich das ganze aber mittels PHP entpacken will, muss ich aber irgendwie unterscheiden können was die Dateiinfos sind und was der Dateiinhalt.
 
Nicht jedes *.tar-Archiv muss den String ustar enthalten. Dies ist nur eine Befügung bei neueren Archiven. Sehr hilfreich bei diesem Thema ist übrigens das englische Wikipedia. Zu diesem Thema habe ich im übrigen auch mal eine Methode geschrieben, die allerdings noch ein paar Fehler enthält, die auch bis jetzt nicht behoben wurden. Werde mich aber mal ransetzen. Hier die Methode (Setzt übrigens nicht auf ustar).
MfG, Andy

PHP:
    /**
    * untar() - Unpacks a tar-archiv
    * 
    * @access public
    * @param Str $tar
    * @param Str $to
    * @return Boolean
    */
    public function untar($tar, $to)
    {
        // does the tar-archiv exists
        if (file_exists($tar)) 
        {
            $to = realpath($to);

            if(substr($to, -1) != '/')
            {
                $to .= '/';
            }

            if(false == is_dir($to))
            {
                // create relativ dir
                mkdir($to, 0777);
            }

            // open tarball
            $tar = fopen($tar, 'r');

            // do until reaching end of tar-archiv
            while (!feof($tar))
            {
                // read info-block
                $info = fread($tar, 512);
                $name = trim(substr($info, 0, 100));
                $size = octdec(trim(substr($info, 124, 12)));

                // if $name is a dir create it
                if($size == 0 && false == is_dir($name))
                {
                    mkdir($to . $name, 0777);
                }

                else
                {
                    // read content-block
                    $content = '';
                    for ($rec = 0; $rec < $size; $rec+=512)
                    {
                        $content .= trim(fread($tar, 512));
                    }

                    // write content into file
                    $file = fopen($to . $name, 'a');
                    fwrite($file, $content);
                    fclose($file);
                }
            }

            // close tar-file
            fclose($tar);
        }

        else
        {
            throw new Exception('Tarball does not exist.');
        }
    }

PS: Die folgende Zeile ist zum Beispiel falsch. Es wird nicht zwischen Ordnern und leeren Dateien unterschieden.

PHP:
if($size == 0 && false == is_dir($name))
 
Zuletzt bearbeitet von einem Moderator:
Also ist da Tutorial in sofern nicht wirklich einsetzbar.
Da das Packen bzw. entpacken aber eh auf dem Server passieren soll hab ich mir mitlerweile eine andere Möglichkeit überlegt um die Pakete zu komprimieren.
Danke erstmal Euch beiden.

@ Catull:
Zeichen 257 im Infoblock. Kannst Du dass nicht einbeziehen? Wenn es ne 5 ist, ist es ein Verzeichnis.
 
Zuletzt bearbeitet:
Genau das möchte ich noch machen. Kam aber bisher nicht dazu. Werde mich die Tage mal ranmachen und dann hier das Ergebnis nochmal vorstellen.
MfG, Andy
 
Zurück