• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

[ERLEDIGT] ZipArchiv lässt sich nur mit WinRAR öffnen

_R_A_L_F_

Mitglied
Hallo zusammen,

ich möchte gerne einen Ordner zippen was mit folgendem Code auch einwandfrei klappt.

Das Problem ist nur. Mit WinRAR lässt sich die .zip Datei öffnen und es werden auch die gezippten Inhalte angezeigt.
Mit dem Standard Windows Explorer öffnet sich zwar das .zip Archiv, aber der Inhalt wird nicht angezeigt.

Woran liegt das?

Als Fehlermeldung erhalte ich beim extrahieren:
"Der ZIP-komprimierte Ordner "Beispiel.zip" ist ungültig"

Danke

PHP:
<?php
  
   
    $sourcePath = realpath('../ordner'/');

    $archiv = new ZipArchive();

    $archiv->open('datei.zip', ZipArchive::CREATE);

    $dirIter = new RecursiveDirectoryIterator($sourcePath);

    $iter = new RecursiveIteratorIterator($dirIter);

   

    foreach($iter as $element) {

        /* @var $element SplFileInfo */

        $dir = str_replace($sourcePath, '', $element->getPath()) . '/';

        if ($element->isDir()) {

            $archiv->addEmptyDir($dir);

        } elseif ($element->isFile()) {

            $file         = $element->getPath() .

                            '/' . $element->getFilename();

            $fileInArchiv = $dir . $element->getFilename();

            $archiv->addFile($file, $fileInArchiv);

        }

    }
   
    $archiv->close();  
   
?>
 
Zuletzt bearbeitet:
Werbung:
Hallo

Ohne Zugriff auf die gepackte Datei können wir nur raten.

Hinweis: Unter Packprogrammen verstehe ich grundsätzlich Programme, die packen und entpacken können.

Die RAR-Packmethode ist grundsätzlich Lizenzpflichtig.

Deshalb dürfen RAR-Packprogramme nicht mit anderer Software oder Betriebssystemen mitgeliefert werden. Sie müssen nachträglich installiert und die gewünschten Verknüpfungen müssen manchmal manuell erstellt werden.

Auch darf ein ZIP-Packprogramm keine RAR-Files entpacken. Außer es enthält eine RAR-Lizenz, was aber in der Regel nicht gegeben ist.

An solch einer fehlenden Verknüpfung könnte das Entpacken scheitern.

Weiterhin ist eine Dateiendung nur ein Hinweis auf das verwendete Packverfahren. Eine ZIP-Datei kann also durchaus mit RAR gepackt worden sein. Beim Entpacken versuchen Packprogramme deshalb immer auch die Packmethode herauszufinden. Deshalb kann es durchaus sein, dass der WinRAR die Datei entpacken kann.

Bei selbstgeschriebenen Programmen denken die Programmierer häufig nicht an diese Zusammenhänge. Wenn vorgegeben wird, dass bei einer zip-Endung grundsätzlich ein ZIP-Packprogramm verwendet wird können RAR-gepackte Dateien nicht entpackt werden.

Ich kenne mich mit PHP nicht aus. Aber eventuell kannst du die Fehlermeldung abfangen und dann einen RAR-Entpacker auf die gepackte Datei loslassen.

Du solltest dich also von der Vorstellung lösen, dass die Endung einer Datei auch immer die Packmethode verrät.

Die Fehlermeldung deutet jedenfalls darauf hin das die ZIP-Datei keinen ZIP-Inhalt enthält. Da das Entpacken mit WinRAR funktioniert ist der Inhalt eventuell mit RAR-gepackt.

Gruss

MrMurphy
 
Werbung:
Auch darf ein ZIP-Packprogramm keine RAR-Files entpacken
Macht es bei mir aber, und genauso auch anders herum (7-Zip u. WinRAR) o_O

Achtung, und jetzt kommt's: ohne in ihren Einstellungen explizit die Dateitypen mit der Anwendung verknüpft zu haben (.rar, .zip für 7-Zip, .7z, .7-zip, .zip für WinRAR) :cool:

Wenn sie das tatsächlich nicht "dürf(t)en", würde diese Option in ihnen überhaupt nicht existieren, dem Nutzer nicht zur (freien) Auswahl gestellt werden.
 
Danke für eure Hilfe.

Der entscheidende "Fehler" war diese Zeile:

PHP:
$dir = str_replace($sourcePath, '', $element->getPath()) . '/';

habe diese jetzt ersetzt durch

PHP:
$dir = $element->getPath();

und dann geht es auch mit dem Windows Explorer ;)

Hat eben den Nachteil, dass unter WinRAR nun die Dateien doppelte angezeigt werden einmal mit /datei.txt und einmal datei.txt aber das stört mich nicht weiter, da der Standard Benutzer wahrscheinlich echt WinRAR gar nicht kennt :D

EDIT

Das Script muss oben nur ergänzt werden um folgende Zeile

PHP:
$fileInArchiv = $dir . $element->getFilename();
$fileInArchiv = str_replace('/','',$fileInArchiv); //Diese Zeile entfernt das / vor der Datei und somit klappt auch das extrahieren

Grüße
 
Zuletzt bearbeitet von einem Moderator:
Zurück
Oben