⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zip.c

📁 zlib 内存压缩解压程序。。可以在内存中进行压缩解压、
💻 C
📖 第 1 页 / 共 3 页
字号:
              size_extrafield_global+i) = *(comment+i);    if (zi->ci.central_header == NULL)        return ZIP_INTERNALERROR;    /* write the local header */    err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC,4);    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);    if (err==ZIP_OK)        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield_local,2);    if ((err==ZIP_OK) && (size_filename>0))        if (ZWRITE(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)                err = ZIP_ERRNO;    if ((err==ZIP_OK) && (size_extrafield_local>0))        if (ZWRITE(zi->z_filefunc,zi->filestream,extrafield_local,size_extrafield_local)                                                                           !=size_extrafield_local)                err = ZIP_ERRNO;    zi->ci.stream.avail_in = (uInt)0;    zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;    zi->ci.stream.next_out = zi->ci.buffered_data;    zi->ci.stream.total_in = 0;    zi->ci.stream.total_out = 0;    if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))    {        zi->ci.stream.zalloc = (alloc_func)0;        zi->ci.stream.zfree = (free_func)0;        zi->ci.stream.opaque = (voidpf)0;        if (windowBits>0)            windowBits = -windowBits;        err = deflateInit2(&zi->ci.stream, level,               Z_DEFLATED, windowBits, memLevel, strategy);        if (err==Z_OK)            zi->ci.stream_initialised = 1;    }#    ifndef NOCRYPT    zi->ci.crypt_header_size = 0;    if ((err==Z_OK) && (password != NULL))    {        unsigned char bufHead[RAND_HEAD_LEN];        unsigned int sizeHead;        zi->ci.encrypt = 1;        zi->ci.pcrc_32_tab = get_crc_table();        /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/        sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);        zi->ci.crypt_header_size = sizeHead;        if (ZWRITE(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)                err = ZIP_ERRNO;    }#    endif    if (err==Z_OK)        zi->in_opened_file_inzip = 1;    return err;}extern int ZEXPORT zipOpenNewFileInZip2(file, filename, zipfi,                                        extrafield_local, size_extrafield_local,                                        extrafield_global, size_extrafield_global,                                        comment, method, level, raw)    zipFile file;    const char* filename;    const zip_fileinfo* zipfi;    const void* extrafield_local;    uInt size_extrafield_local;    const void* extrafield_global;    uInt size_extrafield_global;    const char* comment;    int method;    int level;    int raw;{    return zipOpenNewFileInZip3 (file, filename, zipfi,                                 extrafield_local, size_extrafield_local,                                 extrafield_global, size_extrafield_global,                                 comment, method, level, raw,                                 -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,                                 NULL, 0);}extern int ZEXPORT zipOpenNewFileInZip (file, filename, zipfi,                                        extrafield_local, size_extrafield_local,                                        extrafield_global, size_extrafield_global,                                        comment, method, level)    zipFile file;    const char* filename;    const zip_fileinfo* zipfi;    const void* extrafield_local;    uInt size_extrafield_local;    const void* extrafield_global;    uInt size_extrafield_global;    const char* comment;    int method;    int level;{    return zipOpenNewFileInZip2 (file, filename, zipfi,                                 extrafield_local, size_extrafield_local,                                 extrafield_global, size_extrafield_global,                                 comment, method, level, 0);}local int zipFlushWriteBuffer(zi)  zip_internal* zi;{    int err=ZIP_OK;    if (zi->ci.encrypt != 0)    {#ifndef NOCRYPT        uInt i;        int t;        for (i=0;i<zi->ci.pos_in_buffered_data;i++)            zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab,                                       zi->ci.buffered_data[i],t);#endif    }    if (ZWRITE(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data)                                                                    !=zi->ci.pos_in_buffered_data)      err = ZIP_ERRNO;    zi->ci.pos_in_buffered_data = 0;    return err;}extern int ZEXPORT zipWriteInFileInZip (file, buf, len)    zipFile file;    const void* buf;    unsigned len;{    zip_internal* zi;    int err=ZIP_OK;    if (file == NULL)        return ZIP_PARAMERROR;    zi = (zip_internal*)file;    if (zi->in_opened_file_inzip == 0)        return ZIP_PARAMERROR;    zi->ci.stream.next_in = (void*)buf;    zi->ci.stream.avail_in = len;    zi->ci.crc32 = crc32(zi->ci.crc32,buf,len);    while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))    {        if (zi->ci.stream.avail_out == 0)        {            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)                err = ZIP_ERRNO;            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;            zi->ci.stream.next_out = zi->ci.buffered_data;        }        if(err != ZIP_OK)            break;        if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))        {            uLong uTotalOutBefore = zi->ci.stream.total_out;            err=deflate(&zi->ci.stream,  Z_NO_FLUSH);            zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;        }        else        {            uInt copy_this,i;            if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)                copy_this = zi->ci.stream.avail_in;            else                copy_this = zi->ci.stream.avail_out;            for (i=0;i<copy_this;i++)                *(((char*)zi->ci.stream.next_out)+i) =                    *(((const char*)zi->ci.stream.next_in)+i);            {                zi->ci.stream.avail_in -= copy_this;                zi->ci.stream.avail_out-= copy_this;                zi->ci.stream.next_in+= copy_this;                zi->ci.stream.next_out+= copy_this;                zi->ci.stream.total_in+= copy_this;                zi->ci.stream.total_out+= copy_this;                zi->ci.pos_in_buffered_data += copy_this;            }        }    }    return err;}extern int ZEXPORT zipCloseFileInZipRaw (file, uncompressed_size, crc32)    zipFile file;    uLong uncompressed_size;    uLong crc32;{    zip_internal* zi;    uLong compressed_size;    int err=ZIP_OK;    if (file == NULL)        return ZIP_PARAMERROR;    zi = (zip_internal*)file;    if (zi->in_opened_file_inzip == 0)        return ZIP_PARAMERROR;    zi->ci.stream.avail_in = 0;    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))        while (err==ZIP_OK)    {        uLong uTotalOutBefore;        if (zi->ci.stream.avail_out == 0)        {            if (zipFlushWriteBuffer(zi) == ZIP_ERRNO)                err = ZIP_ERRNO;            zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;            zi->ci.stream.next_out = zi->ci.buffered_data;        }        uTotalOutBefore = zi->ci.stream.total_out;        err=deflate(&zi->ci.stream,  Z_FINISH);        zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;    }    if (err==Z_STREAM_END)        err=ZIP_OK; /* this is normal */    if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))        if (zipFlushWriteBuffer(zi)==ZIP_ERRNO)            err = ZIP_ERRNO;    if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))    {        err=deflateEnd(&zi->ci.stream);        zi->ci.stream_initialised = 0;    }    if (!zi->ci.raw)    {        crc32 = (uLong)zi->ci.crc32;        uncompressed_size = (uLong)zi->ci.stream.total_in;    }    compressed_size = (uLong)zi->ci.stream.total_out;#    ifndef NOCRYPT    compressed_size += zi->ci.crypt_header_size;#    endif    ziplocal_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/    ziplocal_putValue_inmemory(zi->ci.central_header+20,                                compressed_size,4); /*compr size*/    if (zi->ci.stream.data_type == Z_ASCII)        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);    ziplocal_putValue_inmemory(zi->ci.central_header+24,                                uncompressed_size,4); /*uncompr size*/    if (err==ZIP_OK)        err = add_data_in_datablock(&zi->central_dir,zi->ci.central_header,                                       (uLong)zi->ci.size_centralheader);    free(zi->ci.central_header);    if (err==ZIP_OK)    {        long cur_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);        if (ZSEEK(zi->z_filefunc,zi->filestream,                  zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)            err = ZIP_ERRNO;        if (err==ZIP_OK)            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */        if (err==ZIP_OK) /* compressed size, unknown */            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);        if (err==ZIP_OK) /* uncompressed size, unknown */            err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);        if (ZSEEK(zi->z_filefunc,zi->filestream,                  cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)            err = ZIP_ERRNO;    }    zi->number_entry ++;    zi->in_opened_file_inzip = 0;    return err;}extern int ZEXPORT zipCloseFileInZip (file)    zipFile file;{    return zipCloseFileInZipRaw (file,0,0);}extern int ZEXPORT zipClose (file, global_comment)    zipFile file;    const char* global_comment;{    zip_internal* zi;    int err = 0;    uLong size_centraldir = 0;    uLong centraldir_pos_inzip;    uInt size_global_comment;    if (file == NULL)        return ZIP_PARAMERROR;    zi = (zip_internal*)file;    if (zi->in_opened_file_inzip == 1)    {        err = zipCloseFileInZip (file);    }#ifndef NO_ADDFILEINEXISTINGZIP    if (global_comment==NULL)        global_comment = zi->globalcomment;#endif    if (global_comment==NULL)        size_global_comment = 0;    else        size_global_comment = (uInt)strlen(global_comment);    centraldir_pos_inzip = ZTELL(zi->z_filefunc,zi->filestream);    if (err==ZIP_OK)    {        linkedlist_datablock_internal* ldi = zi->central_dir.first_block ;        while (ldi!=NULL)        {            if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))                if (ZWRITE(zi->z_filefunc,zi->filestream,                           ldi->data,ldi->filled_in_this_block)                              !=ldi->filled_in_this_block )                    err = ZIP_ERRNO;            size_centraldir += ldi->filled_in_this_block;            ldi = ldi->next_datablock;        }    }    free_datablock(zi->central_dir.first_block);    if (err==ZIP_OK) /* Magic End */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);    if (err==ZIP_OK) /* number of this disk */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);    if (err==ZIP_OK) /* number of the disk with the start of the central directory */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);    if (err==ZIP_OK) /* total number of entries in the central dir on this disk */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);    if (err==ZIP_OK) /* total number of entries in the central dir */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);    if (err==ZIP_OK) /* size of the central directory */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);    if (err==ZIP_OK) /* offset of start of central directory with respect to the                            starting disk number */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,                                (uLong)(centraldir_pos_inzip - zi->add_position_when_writting_offset),4);    if (err==ZIP_OK) /* zipfile comment length */        err = ziplocal_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);    if ((err==ZIP_OK) && (size_global_comment>0))        if (ZWRITE(zi->z_filefunc,zi->filestream,                   global_comment,size_global_comment) != size_global_comment)                err = ZIP_ERRNO;    if (ZCLOSE(zi->z_filefunc,zi->filestream) != 0)        if (err == ZIP_OK)            err = ZIP_ERRNO;#ifndef NO_ADDFILEINEXISTINGZIP    TRYFREE(zi->globalcomment);#endif    TRYFREE(zi);    return err;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -