in reply to Re: Archive::Zip - what am I missing?
in thread Archive::Zip - what am I missing?

Try it, the file doesn't get replaced. You need my $newimage1 =  Archive::Zip::Member->newFromFile(

Replies are listed 'Best First'.
Re^3: Archive::Zip - what am I missing?
by regexes (Hermit) on Apr 10, 2008 at 11:55 UTC
    Thanks for the help! I knew I had to be missing something... yes, that allows newimage1.jpeg to be included into the zip archive, however, it puts it in the central directory.
    #!/usr/bin/perl use strict; use Archive::Zip qw(:ERROR_CODES); my $zipFile = Archive::Zip->new(); my $status = $zipFile->read( '/home/clueless/blabla.zip' ); my $oldimage1 = 'branch/stick/image1.jpeg'; my $newimage1 = Archive::Zip::Member->newFromFile( 'newimage1.jpeg' ); my $oldmember = $zipFile->replaceMember( $oldimage1, $newimage1 ); my $stat = $zipFile->overwrite();
    I'm trying to replace image1.jpeg in the branch/stick archive directory.

    Maybe my thought process is incorrect but it would seem to me that a replaceMember method would put the new member in exactly the same location as the old one. It does not appear to be that way... must I declare the archive directory as well? How do I do so? I didn't find any specific methods which appeared to handle this... (of course, I could be overlooking something again.)

    regexes
      If you want if you want to make "newimage1.jpeg" become "branch/stick/image1.jpeg" within the archive, then do this:
      #!/usr/bin/perl use strict; use Archive::Zip qw(:ERROR_CODES); my $zipFile = Archive::Zip->new(); my $status = $zipFile->read( '/home/clueless/blabla.zip' ); my $oldimage1 = 'branch/stick/image1.jpeg'; my $newimage1 = 'newimage1.jpeg'; my $oldmember = $zipFile->updateMember( $oldimage1, $newimage1 ); my $stat = $zipFile->overwrite();
      If you want to remove "branch/stick/image1.jpeg" and add "newimage1.jpeg" under "branch/stick/" do this:
      #!/usr/bin/perl use strict; use Archive::Zip qw(:ERROR_CODES); my $zipFile = Archive::Zip->new(); my $status = $zipFile->read( '/home/clueless/blabla.zip' ); my $oldimage1 = 'branch/stick/image1.jpeg'; my $newimage1 = 'newimage1.jpeg'; my $oldmember = $zipFile->removeMember( $oldimage1 ); my $newmember = $zipFile->addFile( $newimage1, "branch/stick/$newimage +1"); my $stat = $zipFile->overwrite();
        Thanks for the reply!

        The first example... to make newimage1.jpeg become branch/stick/image1.jpeg works correctly.

        The second example, i.e. to remove branch/stick/image1.jpeg and add newimage1.jpeg under branch/stick did not work. It removes the old image according to removeMember but it does not add newimage1.jpeg to the archive.(using addFile)

        If I modify the addFile line just to see if it will pack anything.. (I took out the directory path)
        my $newmember = $zipFile->addFile( $newimage1, $newimage1);
        It does not add the image to the archive directory either.

        As mentioned by an anonymous monk... I posted above (Re^3: Archive::Zip - what am I missing?), that if I do not use
        my $newmember = $zipFile->addFile( $newimage1, "branch/stick/$newimage +1");
        but instead
        my $oldimage1 = 'branch/stick/image1.jpeg'; my $newimage1 = Archive::Zip::Member->newFromFile( 'newimage1.jpeg' ); my $oldmember = $zipFile->replaceMember( $oldimage1, $newimage1 );
        it packs newimage1.jpeg into the archive but not into the correct directory.

        I also tried...
        my $oldmember = $zipFile->replaceMember( $oldimage1, "branch/stick/$ne +wimage1" );
        but it did not work either.

        So to summarize.. it appears that the code below removes the original image (image1.jpeg) but never adds the new image (newimage1.jpeg) at all. Either with or without the archive directory name included. My understanding of the internals of the module is rather low but is this the excpected behaviour? :-)
        my $oldimage1 = 'branch/stick/image1.jpeg'; my $newimage1 = 'newimage1.jpeg'; my $oldmember = $zipFile->removeMember( $oldimage1 ); my $newmember = $zipFile->addFile( $newimage1, "branch/stick/$newimage +1");
        my $oldimage1 = 'branch/stick/image1.jpeg'; my $newimage1 = Archive::Zip::Member->newFromFile( 'newimage1.jpeg' ); my $oldmember = $zipFile->removeMember( $oldimage1 ); my $newmember = $zipFile->addFile( $newimage1, "branch/stick/$newimage +1");
        regexes