alex: dateien komprimieren lassen

Howdy

Ich bin auf der Suche nach einem einfachen Komprimieren von Dateien in Perl. Die Hilfe von Compress::Zlib war leider nicht gut genug für mich.
Ich suche eine Routine, mit der ich eine Datei packen und
diese dann als neue Datei abspeichern kann.
Geausogut muss ich den Weg wieder zurückgehen können.

In der Hilfe war was zu lesen von $var = compress(string), aber das hat sich bei mir immer als einzelnes stringkomprimieren herausgestellt, ich habe aber nicht die Absicht, das über alle zeilen in der zu komprimierenden datei laufen zu lassen, gibt es da nicht was simpleres?

bye
alex

  1. Hallo,

    In der Hilfe war was zu lesen von $var = compress(string), aber das hat sich
    bei mir immer als einzelnes stringkomprimieren herausgestellt, ich habe aber
    nicht die Absicht, das über alle zeilen in der zu komprimierenden datei laufen
    zu lassen, gibt es da nicht was simpleres?

    use Compress::Zlib;

    $compressed = Compress::Zlib::memGzip($str);

    um die komplette Datei zu zippen:

    {
      local $/;
      $compressed = Compress::Zlib::memGzip(<DAT>);
    }

    Mehr Infos:

    perldoc perlvar
    perldoc Compress::Zlib

    Gruesse,
     CK

    1. Hi Chris!

      Das klappt soweit nur mit dem Packen:

      CODE

      use Compress::Zlib ;

      open (DATEI, "data/statistik_ich.txt");
      local $/;
      $zip = Compress::Zlib::memGzip(<DATEI>);
      close (DATEI);

      open (TMP, ">data/statistik_ich.gzip");
      print TMP $zip;
      close (TMP);

      END CODE

      Bis hierhin ist alles in Ordnung, im Verzeichnis liegt die gepackte Datei. Aber ich habe sie mit Perl nicht wieder entpacken können (mit dem System schon):

      ENTPACKCODE

      open (TMP, "data/statistik_ich.gzip");
      local $/;
      $unzip = Compress::Zlib::memGunzip(<TMP>) ;
      print $unzip;
      close (TMP);

      ENDE ENTPACKCODE

      Das ruft folgende Fehlermeldung hervor:

      Argument "^_M-^K^H" isn't numeric in subroutine entry at /usr/lib/perl5/site_perl/5.6.1/i586-linux/Compress/Zlib.pm line 83.
      Your vendor has not defined Compress::Zlib macro memGunzip at ./compress4.cgi line 22

      $unzip = Compress::Zlib::memGunzip($zip); geht ebenfalls genauso wenig .-(

      Was muss ich denn noch beachten?

      gruesse
      alex

      1. Hi alex,

        open (DATEI, "data/statistik_ich.txt");
        local $/;
        $zip = Compress::Zlib::memGzip(<DATEI>);
        close (DATEI);

        mit welcher Betriebssystemplattform arbeitest Du?

        Unter Windows würde das ohne "binmode" so nicht
        funktionieren.

        Anschauungsmaterial:
           http://www.schroepl.net/projekte/gzip_cnc/source.htm

        open (TMP, ">data/statistik_ich.gzip");

        ".gz" wäre ggf. sinnvoller.

        Viele Grüße
        <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

        1. mit welcher Betriebssystemplattform arbeitest Du?

          ich habe meinen apache unter suse 7.3 zu laufen.

          gruesse
          alex

          1. Hi alex,

            mit welcher Betriebssystemplattform arbeitest Du?
            ich habe meinen apache unter suse 7.3 zu laufen.

            schade - dann scheidet "binmode" als Fehlerursache wohl
            aus.

            Viele Grüße
            <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

            1. Hallo Michael,

              mit welcher Betriebssystemplattform arbeitest Du?
              ich habe meinen apache unter suse 7.3 zu laufen.

              schade - dann scheidet "binmode" als Fehlerursache wohl
              aus.

              Da waere ich mir nicht so sicher. Einige Sachen gehen auch bei einem
              Unix ohne 'binmode()' nicht durch das Dateihandle ;-)

              Aber es sieht in diesem Fall eher so aus, als sei Compress::Zlib dafuer
              verantwortlich. Ich wuerde an dieser Stelle

              Compress::Zlib::gzopen
              Compress::Zlib::gzread
              Compress::Zlib::gzwrite

              vorschlagen. Ausfuehrliche Doku ist beim Modul dabei; Beispiel:

              my $gz = gzopen("file.gz","wb9");
              open DAT,'<file' or die $!;

              {
                local $/;
                $gz->gzwrite(<DAT>);
              }

              $gz->gzclose();

              my $gz = gzopen("file.gz","rb");
              open DAT,'>file' or die $!;

              my $buff;
              $gz->gzread($buff);
              print DAT $buff;
              $gz->close;

              Gruesse,
               CK

              1. Hallo Chistian,

                schade - dann scheidet "binmode" als Fehlerursache wohl
                aus.
                Da waere ich mir nicht so sicher. Einige Sachen gehen auch bei einem
                Unix ohne 'binmode()' nicht durch das Dateihandle ;-)

                huch - kannst Du dafür ein Beispiel nennen?
                Meine Perl-Doku sagt ausdrücklich:

                "Binmode has no effect under Unix; in MS-DOS and
                    similarly archaic systems, it may be imperative
                    - otherwise your MS-DOS-damaged C library may
                    mangle your file."

                Wobei es bei gzip_cnc immerhin für Windows 98 notwendig
                war, nicht nur für DOS.

                Viele Grüße
                <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael

                1. Hallo Michael,

                  huch - kannst Du dafür ein Beispiel nennen?

                  Z. B. die Tatsache, dass es bei Filehandles im 'binmode' keine Zeilen
                  geben (duerfte).

                  Meine Perl-Doku sagt ausdrücklich:

                  "Binmode has no effect under Unix; in MS-DOS and
                      similarly archaic systems, it may be imperative
                      - otherwise your MS-DOS-damaged C library may
                      mangle your file."

                  Das wage ich doch arg zu bezweifeln. IMHO muesste das auf zwei Sachen
                  ankommen: das Betriebssystem und die libc.

                  Gruesse,
                   CK

                  P.S.: Noch 24 Tage...

  2. Hi alex,

    In der Hilfe war was zu lesen von $var = compress
    (string), aber das hat sich bei mir immer als
    einzelnes stringkomprimieren herausgestellt,
    ich habe aber nicht die Absicht, das über alle zeilen
    in der zu komprimierenden datei laufen zu lassen,

    das würde auch in der Summe keine korrekte komprimierte
    Datei ergeben.

    gibt es da nicht was simpleres?

    Wer hindert Dich daran, den kompletten Inhalt der Datei
    in einen Skalar einzulesen, diesen zu komprimieren und
    das Ergebnis abzuspeichern etc.?

    Viele Grüße
    <img src="http://www.schroepl.net/projekte/gzip_cnc/gzip_cnc.gif" border=0 alt=""> Michael