zoukankan      html  css  js  c++  java
  • zlib和minizip实现解压zip

    zlib和minizip实现解压zip

    原文连接: https://www.cnblogs.com/mtcnn/p/9410039.html

    #include <stdio.h>
    #include <string.h>
    
    #include "unzip.h"
    
    #define dir_delimter '/'
    #define MAX_FILENAME 512
    #define READ_SIZE 8192
    
    int main( int argc, char **argv )
    {
        if ( argc < 2 )
        {
            printf( "usage:
    %s {file to unzip}
    ", argv[ 0 ] );
            return -1;
        }
    
        // Open the zip file
        unzFile *zipfile = unzOpen( argv[ 1 ] );
        if ( zipfile == NULL )
        {
            printf( "%s: not found
    " );
            return -1;
        }
    
        // Get info about the zip file
        unz_global_info global_info;
        if ( unzGetGlobalInfo( zipfile, &global_info ) != UNZ_OK )
        {
            printf( "could not read file global info
    " );
            unzClose( zipfile );
            return -1;
        }
    
        // Buffer to hold data read from the zip file.
        char read_buffer[ READ_SIZE ];
    
        // Loop to extract all files
        uLong i;
        for ( i = 0; i < global_info.number_entry; ++i )
        {
            // Get info about current file.
            unz_file_info file_info;
            char filename[ MAX_FILENAME ];
            if ( unzGetCurrentFileInfo(
                zipfile,
                &file_info,
                filename,
                MAX_FILENAME,
                NULL, 0, NULL, 0 ) != UNZ_OK )
            {
                printf( "could not read file info
    " );
                unzClose( zipfile );
                return -1;
            }
    
            // Check if this entry is a directory or file.
            const size_t filename_length = strlen( filename );
            if ( filename[ filename_length-1 ] == dir_delimter )
            {
                // Entry is a directory, so create it.
                printf( "dir:%s
    ", filename );
                mkdir( filename );
            }
            else
            {
                // Entry is a file, so extract it.
                printf( "file:%s
    ", filename );
                if ( unzOpenCurrentFile( zipfile ) != UNZ_OK )
                {
                    printf( "could not open file
    " );
                    unzClose( zipfile );
                    return -1;
                }
    
                // Open a file to write out the data.
                FILE *out = fopen( filename, "wb" );
                if ( out == NULL )
                {
                    printf( "could not open destination file
    " );
                    unzCloseCurrentFile( zipfile );
                    unzClose( zipfile );
                    return -1;
                }
    
                int error = UNZ_OK;
                do    
                {
                    error = unzReadCurrentFile( zipfile, read_buffer, READ_SIZE );
                    if ( error < 0 )
                    {
                        printf( "error %d
    ", error );
                        unzCloseCurrentFile( zipfile );
                        unzClose( zipfile );
                        return -1;
                    }
    
                    // Write data to file.
                    if ( error > 0 )
                    {
                        fwrite( read_buffer, error, 1, out ); // You should check return of fwrite...
                    }
                } while ( error > 0 );
    
                fclose( out );
            }
    
            unzCloseCurrentFile( zipfile );
    
            // Go the the next entry listed in the zip file.
            if ( ( i+1 ) < global_info.number_entry )
            {
                if ( unzGoToNextFile( zipfile ) != UNZ_OK )
                {
                    printf( "cound not read next file
    " );
                    unzClose( zipfile );
                    return -1;
                }
            }
        }
    
        unzClose( zipfile );
    
        return 0;
    }
    contrib/minizip/$ gcc -I../.. -o unzip uzip.c unzip.c ioapi.c ../../libz.a
    contrib/minizip/$ ./unzip.exe /j/zlib-125.zip
    
  • 相关阅读:
    Delphi 7下使用VT实现树型列表结合控件
    Spring:源码解读Spring IOC原理
    【HTTP】Fiddler(二)
    简单工厂模式、工厂方法模式、抽象工厂模式 之间的对比
    UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
    Tomcat 的context.xml
    Tomcat的context.xml说明、Context标签讲解
    Node.js
    区块链架构设计
    什么是区块链
  • 原文地址:https://www.cnblogs.com/cqyp/p/13754315.html
Copyright © 2011-2022 走看看