*.tar dekomprimieren

B

Bgag

Abend!
Es ist wieder mal so weit. Der kleine Andy bastelt mal wieder an einer kleinen Klasse herum. Da auf vielen Servern die nötigen Funktionen zum dekomprimieren von *.tar-Archiven oftmals nicht vorhanden sind, habe ich mich etwas mit der Materie von *.tar-Archiven beschäftigt und eine kleine Klasse gebastelt, die das mit den einfachen file()-Funktionen löst. Leider funktioniert sie nicht und ich weiß nicht warum. Ich bekomme trotz error_reporting(E_ALL) keine Fehler angezeigt. Kann mir irgendjemand helfen? Bin echt am verzweifeln. ich hoffe ich habe den Code ausreichend dokumentiert, sodass er leicht verständlich ist.
PHP:
<?php
error_reporting(E_ALL); 

/* TarHandler class */
class TarHandler
{    	
	/**
	* Unpacks a tar-archiv
	* 
	* @name TarHandler::untar()
	* @access public
	* @param String $tar	path to tar-archiv
	* @param String $to	relativ path
	* @return boolean
	*/
	public function untar($tar, $to)
	{
		// does the tar-archiv exists
		if (file_exists($tar)) 
		{	
			// create relativ dir	
			mkdir($to);
			
			// open tarball
			$tar = fopen($tar, 'rb');
			
			// do until reaching end of tar-archiv
			$i=0;
			while (!feof($tar))
			{	
				//count number of files
				$i++;
				
				// read info-block
				$info = fread($tar, 512);
				$data[$i]['name'] = chr(substr($info, 0, 100));
				$data[$i]['mode'] = chr(substr($info, 100, 8));
				$data[$i]['uid'] = chr(substr($info, 108, 8));
				$data[$i]['gid'] = chr(substr($info, 116, 8));
				$data[$i]['size'] = chr(substr($info, 124, 12));
				$data[$i]['time'] = chr(substr($info, 136, 12));
				$data[$i]['check'] = chr(substr($info, 148, 8));
				$data[$i]['link'] = chr(substr($info, 156, 1));
				$data[$i]['linkname'] = chr(substr($info, 157, 100));
				
				// read content-block
				for ($rec = 0; $rec < $data[$i][size]; $rec+=512)
				{
					$content = chr(fread($tar, 512));
				}
				
				
				$file = fopen($data[$i]['name'], 'w');
				fwrite($file, $content);
				fclose($file);
			}
			
			// close tar-file
			fclose($tar);
		}
		
		else 
		{
			throw new Exception('Tarball does not exist.');
		}
	}
}

try 
{	
	$file = ./test.tar;

	$unpack = new TarHandler();
	$unpack->untar($file, 'TestTar');
}

catch(Exception $e) 
{
	return $e->getMessage();
}

?>
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
Ok, sämtliche deiner Arrayzugriffe sind "falsch".

PHP:
$data[$i][name] = chr(substr($info, 0, 100));

Greift nicht auf den Array Eintrag mit dem Schlüssel "name" zu, sondern auf den Arrayeintrag dessen Schlüsselname der Inhalt der Konstante "name" ist. Da du aber keine Konstante names "name" definiert hast, erzeugt es einen Fehler (die bei mir übrigens massenhaft angezeigt werden ;)

PHP:
//count number of files
$i++;
'$i' definierst du gar nicht erst, also kann man es auch nicht hochzählen.

PHP:
$info = fread($tarfile, 512);
Dein Dateipointer heißt doch $tar und nicht $tarfile?

PHP:
$content = chr(fread($tarfile, 512));
s.o.

PHP:
// close tar-file
fclose($tar);
s.o. ;)

PHP:
<?php
error_reporting(E_ALL); 

/* TarHandler class */
class TarHandler
{        
    /**
    * Unpacks a tar-archiv
    * 
    * @name TarHandler::untar()
    * @access public
    * @param String $tar    path to tar-archiv
    * @param String $to    relativ path
    * @return boolean
    */
    public function untar($tar, $to)
    {
        // does the tar-archiv exists
        if (file_exists($tar)) 
        {    
            // create relative dir, if it doesnt exist   
            if(!file_exists($to))
            {
              mkdir($to);
            }
            
            // open tarball
            if(!($tar = fopen($tar, 'rb')))
            {
              throw new Exception('File couldn\'t be opened');
              return;
            }
            
            // do until reaching end of tar-archiv
            $i = 0;
            while (!feof($tar))
            {    
                //count number of files
                $i++;
                
                // read info-block
                $info = fread($tar, 512);
                $data[$i]['name'] = chr(substr($info, 0, 100));
                $data[$i]['mode'] = chr(substr($info, 100, 8));
                $data[$i]['uid'] = chr(substr($info, 108, 8));
                $data[$i]['gid'] = chr(substr($info, 116, 8));
                $data[$i]['size'] = chr(substr($info, 124, 12));
                $data[$i]['time'] = chr(substr($info, 136, 12));
                $data[$i]['check'] = chr(substr($info, 148, 8));
                $data[$i]['link'] = chr(substr($info, 156, 1));
                $data[$i]['linkname'] = chr(substr($info, 157, 100));
                
                
                // read content-block
                /*for ($rec = 0; $rec < $data[$i]['size']; $rec+=512)
                {
                    $content = chr(fread($tar, 512));
                }
                
                
                $file = fopen($data[$i]['name'], 'w');
                fwrite($file, $content);
                fclose($file);*/
                print '<pre>'.print_r($data, true).'</pre>';
            }
            
            // close tar-file
            fclose($tar);
        }
        
        else 
        {
            throw new Exception('Tarball does not exist.');
        }
    }
}

try 
{    
    $file = './test.tar';
    
    $unpack = new TarHandler();
    $unpack->untar($file, 'NestedSets');
}

catch(Exception $e) 
{
    return $e->getMessage();
}

?>
So läuft es zwar, aber die Daten die er dir anzeigt, sehen nicht grad erfreulich aus.
Kenne mich jetzt aber leider überhaupt nicht mit tar aus, um da weiterzuhelfen...
 
Zuletzt bearbeitet:
Ok danke für deine Hilfe. Funktioniert ja trotzdem noch nicht so ganz. Naja egal schaue es mir Morgen nochmal genau an. Macht ja keinen Sinn mehr. Habe mich Heute den ganzen Tag mit dieser Klasse beschäftigt. Wenn noch jemand etwas findet. Ich bin für jede Hilfe dankbar.
MfG, Andy

//EDIT: Habe noch einige Fehler gefunden. Sehr viele Fehler. Habe nochmal neu angefangen. Bin jetzt auf dem richtigen Weg.
 
Zuletzt bearbeitet von einem Moderator:
Zurück