[PHP]bzip2 compressed folder uitpakken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Voor een semi-automatische installatie wil ik graag een bzip2 gecomprimeerd bestand kunnen uitpakken. Nu is er wel wat te vinden in de php manual over bzopen, maar ik wil graag een aantal bestanden, verdeeld over een of meerdere mappen uitpakken. Zegmaar een zip met de volgende inhoud:
code:
1
2
3
./test.txt
./folder/
./folder/test2.txt
Als ik die uitpak, moet dus test.txt in de huidige map worden uitgepakt en test2.txt in een subfolder met de naam folder worden uitgepakt.

Nu is het niet zo moeilijk om een enkele file uit te pakken, nl. volgens de php manual:
PHP:
1
2
3
4
5
6
7
$bz = bzopen("/tmp/foo.bz2", "r");
$decompressed_file = bzread($bz, filesize("/tmp/foo.bz2"));
bzclose($bz);

print( "De inhoud van /tmp/foo.bz2 is: " );
print( "\n<br>\n" );
print( $decompressed_file );
Maar hoe je met een mappenstructuur werkt, is mij een raadsel. Ik kom er niet uit, dus een duwtje in de rug zou ik erg fijn vinden :)

Helaas is de php bij mijn hoster alleen gecompileerd met --with-bz2, en niet met --with-zip, dus helaas gaat het volgende niet op (van http://php.net/zip):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$dir = 'C:\\reports-temp\\';
$zip = zip_open($_FILES['report_zip']['tmp_name']);
while($zip_entry = zip_read($zip)) {
   $entry = zip_entry_open($zip,$zip_entry);
   $filename = zip_entry_name($zip_entry);
   $target_dir = $dir.substr($filename,0,strrpos($filename,'/'));
   $filesize = zip_entry_filesize($zip_entry);
   if (is_dir($target_dir) || mkdir($target_dir)) {
       if ($filesize > 0) {
           $contents = zip_entry_read($zip_entry, $filesize);
           file_put_contents($dir.$filename,$contents);
       }
   }
}
Omdat volgens mij functies als zip_entry_open en zip_entry_filesize niet voor bzip2 bestaat. Of heb ik het nu helemaal mis?

Acties:
  • 0 Henk 'm!

  • _JGC_
  • Registratie: Juli 2000
  • Nu online
Ehm, bzip2 is een stream compressor, niet een archiver zoals tar en zip. Je kunt dus geen directories inpakken met bzip2 zonder deze eerst te bundelen met iets als tar.

Acties:
  • 0 Henk 'm!

  • analog_
  • Registratie: Januari 2004
  • Niet online
Ik heb hetzelfde probleem met mijn hoster dat er geen zip extensies zijn gecompileerd. Wat ik heb gedaan is de zip functie van de shell in mijn scripts aangeroepen met exec(). Hetzelfde zou natuurlijk gaan voor bz2.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
_JGC_ schreef op zaterdag 27 januari 2007 @ 12:16:
Ehm, bzip2 is een stream compressor, niet een archiver zoals tar en zip. Je kunt dus geen directories inpakken met bzip2 zonder deze eerst te bundelen met iets als tar.
Ah, ok. Dat had ik namelijk helemaal niet door 8)7

Maar kan ik dan uberhaupt wel dit voor elkaar krijgen? Wat ik namelijk had gedaan is een aantal bestandjes gecomprimeerd tot een tar.bz2. tar.bz2, tar.gz, tar, zip en rar zijn allemaal geen probleem om te maken. Maar wat moet ik doen om een van deze archives te kunnen decomprimeren?
Mr.SiS schreef op zaterdag 27 januari 2007 @ 12:18:
Ik heb hetzelfde probleem met mijn hoster dat er geen zip extensies zijn gecompileerd. Wat ik heb gedaan is de zip functie van de shell in mijn scripts aangeroepen met exec(). Hetzelfde zou natuurlijk gaan voor bz2.
PHP:
1
exec("tar -xjf ".$path);
Dat werkt, inderdaad totaal niet aan gedacht.
BTW wel erg stom dat je dus php niet zelf laat tarren, maar vervolgens het via exec() wel gewoon kan uitvoeren :?

[ Voor 29% gewijzigd door mithras op 27-01-2007 12:41 ]


Acties:
  • 0 Henk 'm!

Verwijderd

tar.bz2 of tar.tgz zijn gewoon gecomprimeerde tar archiven. je moet dus het tar archive uitpakken en niet het bz2 archive wat dus niet bestaat.

nou zijn er 3 oplossingen:
1) via exec gebruik maken van 'tar -xjf'. dit is de simpelste maar je hoster moet het wel toestaan.
2) je zoekt op internet naar een al bestaand script dat met tar archiven kan omgaan.
3) schrijft je eigen tar-script zoals ik. het tar formaat is echt simpel en kun je met de standaard filesystem functies zoals fread en fwrite maken. omdat tar bestanden gegroepeed zijn in blocken van 512-byte is had ik 1 dag nodig om een totaal hebruikbare class te schrijven en ben nou bezig met een tar defragmentatie functie.

hier een paar linkjes:
http://en.wikipedia.org/wiki/Tar_%28file_format%29
http://www.sunsite.ualber...chapter/tar_8.html#SEC114