Zip-Tool

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Zip-Tool

Beitrag von dr.e. » 14.11.2010, 12:31:20

Hallo Daniel,

die fachliche Ebene ist mir klar, es geht mir mehr um die Implementierung. Du verwendest in einer Klasse A eine Methode in dessen Signatur eine Unterklasse B steht. Das ist eine zirkuläre Abhängigkeit und daher nicht gut.
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Zip-Tool

Beitrag von Well » 14.11.2010, 16:25:26

Okay - Wie würdest du das dann implementieren?

Benutzeravatar
dr.e.
Administrator
Beiträge: 4555
Registriert: 04.11.2007, 16:13:53

Re: Zip-Tool

Beitrag von dr.e. » 14.11.2010, 17:59:27

Die einfache Antwort ist: die Abhängigkeit erst in der Sub-Klasse erzeugen und die Methode einfach verschieben. Alternativ kannst dir überlegen, ein Interface zu definieren, das File und Folder gleichermaßen modelliert und dieses dann als Type-Hint verwenden.
Viele Grüße,
Christian

Well
Beiträge: 263
Registriert: 25.10.2009, 11:00:19
Wohnort: Beuren
Kontaktdaten:

Re: Zip-Tool

Beitrag von Well » 25.11.2010, 20:05:33

Ich lege das von meiner Seite nochmal auf Eis, da ich in nächster Zeit wohl keine Zeit dafür habe.

Wenn in naher Zukunft aber kein anderer Lust darauf hat, setze ich mich irgendwann nochmal dran...

welworx
Beiträge: 620
Registriert: 27.09.2010, 19:29:44

Re: Zip-Tool

Beitrag von welworx » 25.08.2011, 23:52:18

hab grad dieses alte thema gefunden und dachte mir, das ich mal foglenden code reinwerfen könnte ;)

ich hab mir vor nicht all zu langer zeit dieses einfache zip tool geschrieben und es funktioniert bisher ohne probleme.

Code: Alles auswählen

<?php

import('tools::filesystem', 'FilesystemManager');

class zipManager extends APFObject {

    private $zip;

    /**
     * Alle mittels $files übergebenen Dateien und verzeichnisse werden in eine
     * die ZIP Datei geschrieben, die mittels $destination angegeben wird.
     * Es wird ebenfalls geprüft ob alle übermittelten Dateien auch wirklich 
     * vorhanden sind bevor sie in die ZIP Datei eingetragen werden.
     * @param array $files - Einfaches Array, welches die Dateien enhalten muss 
     * die anschließend in die ZIP Datei eingetragen werden.
     * @param string $destination - speicherort und dateiname (inklusive Dateiendung)
     * an dem die ZIP Datei erstellt werden soll.
     * @param boolean $overwrite - Parameter erlaubt oder verbietet das Überschreiben
     * der ZIP Datei.
     * @return boolean Rückgabe Wert ist bei Erfolg true sonst false. 
     */
    public function create_zip($files = array(), $destination='', $overwrite = false) {
        /*
         * Falls die Zipt Datei bereits vorhanden ist und sie nicht überschrieben 
         * werden darf false zurückgeben.
         */
        if (file_exists($destination) && !$overwrite) {
            return false;
        }

        $valid_files = array();
        if (is_array($files)) {
            foreach ($files as $file) {
                //Prüfen ob die Dateien vorhanden sind
                if (file_exists($file)) {
                    $valid_files[] = $file;
                }
            }
        }

        /*
         * Wenn valide Dateien vorhanden sind.
         */
        if (count($valid_files)) {
            //create the archive
            $this->zip = new ZipArchive();
            $feedback = $this->zip->open($destination, $overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE);
            if ($feedback !== true) {
                return false;
            }

            //add the files
            foreach ($valid_files as $file) {
                $this->zip($file);
            }
            $this->zip->close();

            //check to make sure the file exists
            if (file_exists($destination)) {
                return $destination;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * Funktion die die Dateien oder Ordner in die ZIP Datei schreibt. Da Ordner
     * über den Befehl addEmptyDir erzeugt werden müssen, müssen dann iterativ
     * alle Dateien eingetragen werden.
     * @param string $fileOrFolder - Pfad zur Datei oder dem Ordner
     * @param int $depth - Verzeichnistiefe. Damit die Pfade entsprechend erechnet
     * werden können und die Dateien wirklich im richtigen Ordner landen
     */
    private function zip($fileOrFolder, $depth=0) {
        // erhält aus dem pfad alle teile die nachher entfernt werden sollen.
        $path = dirname($fileOrFolder);
        $i = 0;
        while ($i < $depth) {
            $test = dirname($path);
            if ($test == '.') {
                break;
            }
            $path = $test;
        }

        $zipPath = substr(str_replace($path, '', $fileOrFolder), 1);

        if (is_file($fileOrFolder)) {
            $this->zip->addFile($fileOrFolder, $zipPath);
        } else {
            /*
             * Wenn es sich um einen Ordner handelt, diesen auslesen und die zip
             * funktion aufrufen damit dateien eingetragen werden.
             */
            $this->zip->addEmptyDir($zipPath);
            $dir = FilesystemManager::getFolderContent($fileOrFolder);
            foreach ($dir as $file) {
                if (is_dir($fileOrFolder . '/' . $file)) {
                    $this->zip($fileOrFolder . '/' . $file, $depth + 1);
                } else {
                    $this->zip->addFile($fileOrFolder . '/' . $file, $zipPath . '/' . $file);
                }
            }
        }
    }

    /**
     * Exktrahiert eine Zip Datei in ein Verzeichnis.
     * @param string $file - Pfad der zu extrahierenden ZIP Datei (inkl Dateiname und Endung)
     * @param string $destination - Verzeichnis in welches extrahiert werden soll.
     * Anmerkung: Sofern noch nicht vorhanden wird es erstellt. 
     */
    public static function extract_zip($file, $destination) {
        $zip = new ZipArchive;
        $open = $zip->open($file, ZIPARCHIVE::CHECKCONS);
        // If the archive is broken(or just another file renamed to *.zip) the function will return error on httpd under windows, so it's good to check if the archive is ok with ZIPARCHIVE::CHECKCONS
        if ($open === TRUE) {
            if (!$zip->extractTo($destination)) {
                die("Error during extracting");
            }
            $zip->close();
        }
    }

}

?>

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast