Comprindo E Descomprimindo Arquivos

Aqui estão reunidas algumas formas de comprimir e descomprimir arquivos

Comprimindo e descomprimindo arquivos zip em C usando a libzip

#include <zip.h>
#include <cstdlib>
#include <cstdio>
 
#include <iostream>
 
int main( int argc, char **argv )
{
 
    if( argc < 2){
        std::cout << "Uso "   << argv[0] << " arq.zip -> Descomprime os conteúdos do arquivo zip" << std::endl
                                << argv[0] << " arq.zip arq1 arq2 arqn -> Comprime os arquivos dados como argumento e os coloca em arq.zip" << std::endl;
 
        exit(-1);
    }
 
    if( argc == 2 ){ // Descomprime o arquivo zip
        //Open the ZIP archive
        int err = 0;
        zip *z = zip_open(argv[1], 0, &err);
 
        int nentries = zip_get_num_entries( z, ZIP_FL_UNCHANGED );
 
        for( int i = 0; i < nentries; i++ ){
            const char *name  = zip_get_name( z, i, ZIP_FL_UNCHANGED );
            struct zip_stat st;
            zip_stat_init(&st);
            zip_stat(z, name, 0, &st);
 
            //Alloc memory for its uncompressed contents
            char *contents = new char[st.size];
 
            //Read the compressed file
            zip_file *f = zip_fopen(z, name, 0);
            zip_fread(f, contents, st.size);
            zip_fclose(f);
 
            printf("Dezipando arquivo %s\n", name);
 
            FILE *arq = fopen( name, "w" );
            fwrite( contents, sizeof(char), st.size, arq );
            fclose(arq);
 
            delete contents;
        }
 
        //And close the archive
        zip_close(z);
    }
    else { // Comprime os arquivos em um arquivo zip
        int err = 0, sep = 0, zep = 0;
        zip *z = zip_open(argv[1], ZIP_CREATE, &err);
 
        if( !z ){
            std::cout << "Error opening zip file";
        }
 
        for( int i = 2; i < argc; i++ ){
 
            FILE *arq = fopen(argv[i], "r");
 
            zip_source *zst = zip_source_filep( z, arq, 0, -1 );
 
            if(zst == NULL)
            {
                zip_error_get( z, &zep, &sep );
                return false;
            }
 
            int index = (int)zip_add(z, argv[i], zst );
            if(index < 0)
            {
                std::cout << "failed to add file to archive. " << zip_strerror(z) << std::endl;
                return false;
            }
 
        }
 
        zip_close(z);
    }
}

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.