<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 20774 -->
<!-- Reviewed: no -->
<sect2 id="zend.filter.set.compress">
    <title>Compress und Decompress</title>

    <para>
        Diese zwei Filter sind in der Lage Strings, Dateien und Verzeichnisse zu komprimieren und zu
        dekomprimieren. Sie verwenden Adapter und unterstützen die folgenden Kompressions Formate:
    </para>

    <itemizedlist>
        <listitem><para><emphasis>Bz2</emphasis></para></listitem>
        <listitem><para><emphasis>Gz</emphasis></para></listitem>
        <listitem><para><emphasis>Lzf</emphasis></para></listitem>
        <listitem><para><emphasis>Rar</emphasis></para></listitem>
        <listitem><para><emphasis>Tar</emphasis></para></listitem>
        <listitem><para><emphasis>Zip</emphasis></para></listitem>
    </itemizedlist>

    <para>
        Jedes Kompressions Format hat unterschiedliche Fähigkeiten die anbei beschrieben sind. Alle
        Kompressions Filter können fast der selben Art und Weise verwendet werden, und unterscheiden
        sich primär in den vorhandenen Optionen  und der Art der Kompression welche diese anbieten
        (beide bieten Algorithmen für Strings vs. Dateien vs. Verzeichnisse an)
    </para>

    <sect3 id="zend.filter.set.compress.generic">
        <title>Generelle Handhabung</title>

        <para>
            Um einen Kompressions Filter zu erstellen muss man das Kompressions Format auswählen
            welches man verwenden will. Die folgende Beschreibung nimmt den <emphasis>Bz2</emphasis>
            Adapter. Details für alle anderen Adapter werden nach dieser Sektion beschrieben.
        </para>

        <para>
            Diese zwei Filter sind grundsätzlich identisch, da Sie das gleiche Backend verwenden.
            <classname>Zend_Filter_Compress</classname> sollte verwendet werden wenn man Elemente
            komprimieren will, und <classname>Zend_Filter_Decompress</classname> sollte verwendet
            werden wenn man Elemente dekomprimieren will.
        </para>

        <para>
            Wenn man zum Beispiel einen String komprimieren will, müssen wir
            <classname>Zend_Filter_Compress</classname> instanziieren und den gewünschten Adapter
            angeben.
        </para>

        <programlisting language="php"><![CDATA[
$filter = new Zend_Filter_Compress('Bz2');
]]></programlisting>

        <para>
            Um einen anderen Adapter zu verwenden muss dieser einfach im Constructor spezifiziert
            werden.
        </para>

        <para>
            Man kann auch ein Array von Optionen oder ein <classname>Zend_Config</classname> Objekt
            anbieten. Wenn man das tut sollte mindestens der Schlüssel "adapter" angegeben werden,
            und anschließend entweder der Schlüssel "options" oder "adapterOptions" (welches ein
            Array von Optionen ein sollte das dem Adapter bei der Instanziierung übergeben wird).
        </para>

        <programlisting language="php"><![CDATA[
$filter = new Zend_Filter_Compress(array(
    'adapter' => 'Bz2',
    'options' => array(
        'blocksize' => 8,
    ),
));
]]></programlisting>

        <note>
            <title>Standardmäßiger Kompressions Adapter</title>

            <para>
                Wenn kein Kompressions Adapter angegeben wird, dann wird der
                <emphasis>Gz</emphasis> Adapter verwendet.
            </para>
        </note>

        <para>
            Fast die gleiche Verwendung ist die Dekomprimierung eines Strings. Wir müssen in diesem
            Fall nur den Dekompressions Filter verwenden.
        </para>

        <programlisting language="php"><![CDATA[
$filter = new Zend_Filter_Decompress('Bz2');
]]></programlisting>

        <para>
            Um einen komprimierten String zu erhalten muss der originale String angegeben werden.
            Der gefilterte Wert ist die komprimierte Version des originalen Strings.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Compress('Bz2');
$compressed = $filter->filter('Uncompressed string');
// Gibt den komprimierten String zurück
]]></programlisting>

        <para>
            Dekomprimierung funktioniert auf die gleiche Weise.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Decompress('Bz2');
$compressed = $filter->filter('Compressed string');
// Gibt den dekomprimierten String zurück
]]></programlisting>

        <note>
            <title>Hinweis zur Komprimierung von Strings</title>

            <para>
                Nicht alle Adapter unterstützen die Kompression von Strings. Kompressions Formate
                wie <emphasis>Rar</emphasis> können nur Dateien und Verzeichnisse verarbeiten. Für
                Details muss man in die Sektion für den Adapter gesehen werden den man verwenden
                will.
            </para>
        </note>
    </sect3>

    <sect3 id="zend.filter.set.compress.archive">
        <title>Ein Archiv erstellen</title>

        <para>
            Die Erstellung einer Archivedatei arbeitet fast auf die gleiche Weise wie die
            Komprimierung eines Strings. Trotzdem benötigen wir in diesem Fall einen zusätzlichen
            Parameter welcher den Namen des Archivs enthält welches wir erstellen wollen.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Compress(array(
    'adapter' => 'Bz2',
    'options' => array(
        'archive' => 'filename.bz2',
    ),
));
$compressed = $filter->filter('Uncompressed string');
// Gibt bei Erfolg true zurück und erstellt die Archiv Datei
]]></programlisting>

        <para>
            Im obigen Beispeil wird der unkomprimierte String komprimiert, und wird dann in die
            angegebene Archiv Datei geschrieben.
        </para>

        <note>
            <title>Existierende Archive werden überschrieben</title>

            <para>
                Der Inhalt einer existierenden Datei wird überschrieben wenn der angegebene
                Dateiname des Archivs bereits existiert.
            </para>
        </note>

        <para>
            Wenn man eine Datei komprimieren will, dann muss man den Namen der Datei mit dessen Pfad
            angeben.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Compress(array(
    'adapter' => 'Bz2',
    'options' => array(
        'archive' => 'filename.bz2'
    ),
));
$compressed = $filter->filter('C:\temp\compressme.txt');
// Gibt bei Erfolg true zurück und erstellt die Archiv Datei
]]></programlisting>

        <para>
            Man kann auch ein Verzeichnis statt einem Dateinamen spezifizieren. In diesem Fall wird
            das gesamte Verzeichnis mit allen seinen Dateien und Unterverzeichnissen in das Archiv
            komprimiert.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Compress(array(
    'adapter' => 'Bz2',
    'options' => array(
        'archive' => 'filename.bz2'
    ),
));
$compressed = $filter->filter('C:\temp\somedir');
// Gibt bei Erfolg true zurück und erstellt die Archiv Datei
]]></programlisting>

        <note>
            <title>Keine großen oder Basisverzeichnisse komprimieren</title>

            <para>
                Man sollte niemals große oder Basisverzeichnisse wie eine komplette Partition
                komprimieren. Die Komprimierung einer kompletten Partition ist ein sehr
                Zeitintensiver Task welcher zu massiven Problemen auf dem Server führen kann,
                wenn es nicht genug Platz gibt, oder das eigene Skript zu viel Zeit benötigt.
            </para>
        </note>
    </sect3>

    <sect3 id="zend.filter.set.compress.decompress">
        <title>Ein Archiv dekomprimieren</title>

        <para>
            Die Dekomprimierung einer Archivdatei arbeitet fast wie dessen Komprimierung. Man muss
            entweder die Eigenschaft <property>archive</property> spezifizieren, oder den Dateinamen
            des Archivs angeben wenn man die Datei dekomprimiert.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Decompress('Bz2');
$compressed = $filter->filter('filename.bz2');
// Gibt bei Erfolg true zurück und dekomprimiert die Archiv Datei
]]></programlisting>

        <para>
            Einige Adapter unterstützen die Dekomprimierung des Archivs in ein anderes
            Unterverzeichnis. In diesem Fall kann der Parameter <property>target</property>
            spezifiziert werden.
        </para>

        <programlisting language="php"><![CDATA[
$filter     = new Zend_Filter_Decompress(array(
    'adapter' => 'Zip',
    'options' => array(
        'target' => 'C:\temp',
    )
));
$compressed = $filter->filter('filename.zip');
// Gibt bei Erfolg true zurück und dekomprimiert die Archiv Datei
// in das angegebene Zielverzeichnis
]]></programlisting>

        <note>
            <title>Verzeichnisse in welche extrahiert werden soll müssen existieren</title>

            <para>
                Wenn man ein Archiv in ein Verzeichnis dekomprimieren will, dann muss dieses
                Verzeichnis existieren.
            </para>
        </note>
    </sect3>

    <sect3 id="zend.filter.set.compress.bz2">
        <title>Bz2 Adapter</title>

        <para>
            Der Bz2 Adapter kann folgendes komprimieren und dekomprimieren:
        </para>

        <itemizedlist>
            <listitem><para>Strings</para></listitem>
            <listitem><para>Dateien</para></listitem>
            <listitem><para>Verzeichnisse</para></listitem>
        </itemizedlist>

        <para>
            Dieser Adapter verwendet <acronym>PHP</acronym>'s Bz2 Erweiterung.
        </para>

        <para>
            Um die Komprimierung anzupassen unterstützt dieser Adapter die folgenden Optionen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>Archive</emphasis>: Dieser Parameter setzt die Archivdatei welche
                    verwendet oder erstellt werden soll.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Blocksize</emphasis>: Dieser Parameter setzt die Blockgröße welche
                    zu verwenden ist. Diese kann zwischen '0' und '9' liegen. Der Standardwert ist
                    '4'.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Alle Optionen können bei der Instanziierung oder durch Verwendung der betreffenden
            Methode verwendet werden. Zum Beispiel sind die zu 'Blocksize' gehörenden Methoden
            <methodname>getBlocksize()</methodname> und <methodname>setBlocksize()</methodname>.
            Man kann auch die <methodname>setOptions()</methodname> Methode verwenden welche
            alle Optionen als Array akzeptiert.
        </para>
    </sect3>

    <sect3 id="zend.filter.set.compress.gz">
        <title>Gz Adapter</title>

        <para>
            Der Gz Adapter kann folgendes komprimieren und dekomprimieren:
        </para>

        <itemizedlist>
            <listitem><para>Strings</para></listitem>
            <listitem><para>Dateien</para></listitem>
            <listitem><para>Verzeichnisse</para></listitem>
        </itemizedlist>

        <para>
            Dieser Adapter verwendet <acronym>PHP</acronym>'s Zlib Erweiterung.
        </para>

        <para>
            Um die Komprimierung anzupassen unterstützt dieser Adapter die folgenden Optionen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>Archive</emphasis>: Dieser Parameter setzt die Archivdatei welche
                    verwendet oder erstellt werden soll.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Level</emphasis>: Das Level der Kompression welches verwendet werden
                    soll. Es kann zwischen '0' und '9' liegen. Der Standardwert ist '9'.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Mode</emphasis>: Es gibt zwei unterstützte Modi. 'compress' und
                    'deflate'. Der Standardwert ist 'compress'.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Alle Optionen können bei der Instanziierung oder durch Verwendung der betreffenden
            Methode verwendet werden. Zum Beispiel sind die zu 'Level' gehörenden Methoden
            <methodname>getLevel()</methodname> und <methodname>setLevel()</methodname>.
            Man kann auch die <methodname>setOptions()</methodname> Methode verwenden welche
            alle Optionen als Array akzeptiert.
        </para>
    </sect3>

    <sect3 id="zend.filter.set.compress.lzf">
        <title>Lzf Adapter</title>

        <para>
            Der Lzf Adapter kann folgendes komprimieren und dekomprimieren:
        </para>

        <itemizedlist>
            <listitem><para>Strings</para></listitem>
        </itemizedlist>

        <note>
            <title>Lzf unterstützt nur Strings</title>

            <para>
                Der Lzf Adapter kann keine Dateien oder Verzeichnisse verarbeiten.
            </para>
        </note>

        <para>
            Dieser Adapter verwendet <acronym>PHP</acronym>'s Lzf Erweiterung.
        </para>

        <para>
            Es sind keine Optionen vorhanden um diesen Adapter anzupassen.
        </para>
    </sect3>

    <sect3 id="zend.filter.set.compress.rar">
        <title>Rar Adapter</title>

        <para>
            Der Rar Adapter kann folgendes komprimieren und dekomprimieren:
        </para>

        <itemizedlist>
            <listitem><para>Dateien</para></listitem>
            <listitem><para>Verzeichnisse</para></listitem>
        </itemizedlist>

        <note>
            <title>Rar unterstützt keine Strings</title>

            <para>
                Der Rar Adapter kann keine Strings verarbeiten.
            </para>
        </note>

        <para>
            Dieser Adapter verwendet <acronym>PHP</acronym>'s Rar Erweiterung.
        </para>

        <note>
            <title>Die Kompression wird von Rar nicht unterstützt</title>

            <para>
                Durch Beschränkungen des Kompressions Formats von Rar, gibt es keine frei
                erhältliche Komprimierung. Wenn man Dateien in ein neues Rar Archiv komprimieren
                will, muss man dem Adapter einen Callback anbieten mit dem ein Rar Kompressions
                Programm aufgerufen wird.
            </para>
        </note>

        <para>
            Um die Komprimierung anzupassen unterstützt dieser Adapter die folgenden Optionen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>Archive</emphasis>: Dieser Parameter setzt die Archivdatei welche
                    verwendet oder erstellt werden soll.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Callback</emphasis>: Ein Callback welcher diesem Adapter Unterstützung
                    für Komprimierung anbietet.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Password</emphasis>: Das Passwort welches für die Dekomprimierung
                    verwendet werden soll.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Target</emphasis>: Das Ziel zu dem dekomprimierte Dateien geschrieben
                    werden.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Alle Optionen können bei der Instanziierung oder durch Verwendung der betreffenden
            Methode verwendet werden. Zum Beispiel sind die zu 'Target' gehörenden Methoden
            <methodname>getTarget()</methodname> und <methodname>setTarget()</methodname>.
            Man kann auch die <methodname>setOptions()</methodname> Methode verwenden welche
            alle Optionen als Array akzeptiert.
        </para>
    </sect3>

    <sect3 id="zend.filter.set.compress.tar">
        <title>Tar Adapter</title>

        <para>
            Der Rar Adapter kann folgendes komprimieren und dekomprimieren:
        </para>

        <itemizedlist>
            <listitem><para>Dateien</para></listitem>
            <listitem><para>Verzeichnisse</para></listitem>
        </itemizedlist>

        <note>
            <title>Tar unterstützt keine Strings</title>

            <para>
                Der Tar Adapter kann keine Strings verarbeiten.
            </para>
        </note>

        <para>
            Dieser Adapter verwendet <acronym>PEAR</acronym>'s <classname>Archive_Tar</classname>
            Komponente.
        </para>

        <para>
            Um die Komprimierung anzupassen unterstützt dieser Adapter die folgenden Optionen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>Archive</emphasis>: Dieser Parameter setzt die Archivdatei welche
                    verwendet oder erstellt werden soll.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Mode</emphasis>: Ein Modus der für die Komprimierung verwendet werden
                    soll. Unterstützt werden entweder '<constant>NULL</constant>', was keine
                    Komprimierung bedeutet, 'Gz' was <acronym>PHP</acronym>'s Zlib Erweiterung
                    verwendet, und 'Bz2' was <acronym>PHP</acronym>'s Bz2 Erweiterung verwendet. Der
                    Standardwert ist '<constant>NULL</constant>'.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Target</emphasis>: Das Ziel zu dem dekomprimierte Dateien geschrieben
                    werden.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Alle Optionen können bei der Instanziierung oder durch Verwendung der betreffenden
            Methode verwendet werden. Zum Beispiel sind die zu 'Target' gehörenden Methoden
            <methodname>getTarget()</methodname> und <methodname>setTarget()</methodname>.
            Man kann auch die <methodname>setOptions()</methodname> Methode verwenden welche
            alle Optionen als Array akzeptiert.
        </para>

        <note>
            <title>Verwendung von Verzeichnissen</title>

            <para>
                Wenn Verzeichnisse mit Tar komprimiert werden, dann wird der komplette Dateipfad
                verwendet. Das bedeutet das erstellte Tar Dateien nicht nur das Unterverzeichnis
                sondern den kompletten Pfad für die komprimierten Dateien enthält.
            </para>
        </note>
    </sect3>

    <sect3 id="zend.filter.set.compress.zip">
        <title>Zip Adapter</title>

        <para>
            Der Rar Adapter kann folgendes komprimieren und dekomprimieren:
        </para>

        <itemizedlist>
            <listitem><para>Strings</para></listitem>
            <listitem><para>Dateien</para></listitem>
            <listitem><para>Verzeichnisse</para></listitem>
        </itemizedlist>

        <note>
            <title>Zip unterstützt die Dekomprimierung von Strings nicht</title>

            <para>
                Der Zip Adapter kann die Dekomprimierung von Strings nicht verarbeiten; eine
                Dekomprimierung wird immer in eine Datei geschrieben.
            </para>
        </note>

        <para>
            Dieser Adapter verwendet <acronym>PHP</acronym>'s <classname>Zip</classname>
            Erweiterung.
        </para>

        <para>
            Um die Komprimierung anzupassen unterstützt dieser Adapter die folgenden Optionen:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>Archive</emphasis>: Dieser Parameter setzt die Archivdatei welche
                    verwendet oder erstellt werden soll.
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis>Target</emphasis>: Das Ziel zu dem dekomprimierte Dateien geschrieben
                    werden.
                </para>
            </listitem>
        </itemizedlist>

        <para>
            Alle Optionen können bei der Instanziierung oder durch Verwendung der betreffenden
            Methode verwendet werden. Zum Beispiel sind die zu 'Target' gehörenden Methoden
            <methodname>getTarget()</methodname> und <methodname>setTarget()</methodname>.
            Man kann auch die <methodname>setOptions()</methodname> Methode verwenden welche
            alle Optionen als Array akzeptiert.
        </para>
    </sect3>
</sect2>
