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

📄 zip.c

📁 zlib 内存压缩解压程序。。可以在内存中进行压缩解压、
💻 C
📖 第 1 页 / 共 3 页
字号:
    x = (uLong)i;    if (err==ZIP_OK)        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);    x += ((uLong)i)<<8;    if (err==ZIP_OK)        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);    x += ((uLong)i)<<16;    if (err==ZIP_OK)        err = ziplocal_getByte(pzlib_filefunc_def,filestream,&i);    x += ((uLong)i)<<24;    if (err==ZIP_OK)        *pX = x;    else        *pX = 0;    return err;}#ifndef BUFREADCOMMENT#define BUFREADCOMMENT (0x400)#endif/*  Locate the Central directory of a zipfile (at the end, just before    the global comment)*/local uLong ziplocal_SearchCentralDir OF((    const zlib_filefunc_def* pzlib_filefunc_def,    voidpf filestream));local uLong ziplocal_SearchCentralDir(pzlib_filefunc_def,filestream)    const zlib_filefunc_def* pzlib_filefunc_def;    voidpf filestream;{    unsigned char* buf;    uLong uSizeFile;    uLong uBackRead;    uLong uMaxBack=0xffff; /* maximum size of global comment */    uLong uPosFound=0;    if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)        return 0;    uSizeFile = ZTELL(*pzlib_filefunc_def,filestream);    if (uMaxBack>uSizeFile)        uMaxBack = uSizeFile;    buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);    if (buf==NULL)        return 0;    uBackRead = 4;    while (uBackRead<uMaxBack)    {        uLong uReadSize,uReadPos ;        int i;        if (uBackRead+BUFREADCOMMENT>uMaxBack)            uBackRead = uMaxBack;        else            uBackRead+=BUFREADCOMMENT;        uReadPos = uSizeFile-uBackRead ;        uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?                     (BUFREADCOMMENT+4) : (uSizeFile-uReadPos);        if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)            break;        if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)            break;        for (i=(int)uReadSize-3; (i--)>0;)            if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&                ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))            {                uPosFound = uReadPos+i;                break;            }        if (uPosFound!=0)            break;    }    TRYFREE(buf);    return uPosFound;}#endif /* !NO_ADDFILEINEXISTINGZIP*//************************************************************/extern zipFile ZEXPORT zipOpen2 (pathname, append, globalcomment, pzlib_filefunc_def)    const char *pathname;    int append;    zipcharpc* globalcomment;    zlib_filefunc_def* pzlib_filefunc_def;{    zip_internal ziinit;    zip_internal* zi;    int err=ZIP_OK;    if (pzlib_filefunc_def==NULL)        fill_fopen_filefunc(&ziinit.z_filefunc);    else        ziinit.z_filefunc = *pzlib_filefunc_def;    ziinit.filestream = (*(ziinit.z_filefunc.zopen_file))                 (ziinit.z_filefunc.opaque,                  pathname,                  (append == APPEND_STATUS_CREATE) ?                  (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :                    (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));    if (ziinit.filestream == NULL)        return NULL;    ziinit.begin_pos = ZTELL(ziinit.z_filefunc,ziinit.filestream);    ziinit.in_opened_file_inzip = 0;    ziinit.ci.stream_initialised = 0;    ziinit.number_entry = 0;    ziinit.add_position_when_writting_offset = 0;    init_linkedlist(&(ziinit.central_dir));    zi = (zip_internal*)ALLOC(sizeof(zip_internal));    if (zi==NULL)    {        ZCLOSE(ziinit.z_filefunc,ziinit.filestream);        return NULL;    }    /* now we add file in a zipfile */#    ifndef NO_ADDFILEINEXISTINGZIP    ziinit.globalcomment = NULL;    if (append == APPEND_STATUS_ADDINZIP)    {        uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/        uLong size_central_dir;     /* size of the central directory  */        uLong offset_central_dir;   /* offset of start of central directory */        uLong central_pos,uL;        uLong number_disk;          /* number of the current dist, used for                                    spaning ZIP, unsupported, always 0*/        uLong number_disk_with_CD;  /* number the the disk with central dir, used                                    for spaning ZIP, unsupported, always 0*/        uLong number_entry;        uLong number_entry_CD;      /* total number of entries in                                    the central dir                                    (same than number_entry on nospan) */        uLong size_comment;        central_pos = ziplocal_SearchCentralDir(&ziinit.z_filefunc,ziinit.filestream);        if (central_pos==0)            err=ZIP_ERRNO;        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,                                        central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)            err=ZIP_ERRNO;        /* the signature, already checked */        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&uL)!=ZIP_OK)            err=ZIP_ERRNO;        /* number of this disk */        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk)!=ZIP_OK)            err=ZIP_ERRNO;        /* number of the disk with the start of the central directory */        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_disk_with_CD)!=ZIP_OK)            err=ZIP_ERRNO;        /* total number of entries in the central dir on this disk */        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry)!=ZIP_OK)            err=ZIP_ERRNO;        /* total number of entries in the central dir */        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&number_entry_CD)!=ZIP_OK)            err=ZIP_ERRNO;        if ((number_entry_CD!=number_entry) ||            (number_disk_with_CD!=0) ||            (number_disk!=0))            err=ZIP_BADZIPFILE;        /* size of the central directory */        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&size_central_dir)!=ZIP_OK)            err=ZIP_ERRNO;        /* offset of start of central directory with respect to the            starting disk number */        if (ziplocal_getLong(&ziinit.z_filefunc, ziinit.filestream,&offset_central_dir)!=ZIP_OK)            err=ZIP_ERRNO;        /* zipfile global comment length */        if (ziplocal_getShort(&ziinit.z_filefunc, ziinit.filestream,&size_comment)!=ZIP_OK)            err=ZIP_ERRNO;        if ((central_pos<offset_central_dir+size_central_dir) &&            (err==ZIP_OK))            err=ZIP_BADZIPFILE;        if (err!=ZIP_OK)        {            ZCLOSE(ziinit.z_filefunc, ziinit.filestream);            return NULL;        }        if (size_comment>0)        {            ziinit.globalcomment = ALLOC(size_comment+1);            if (ziinit.globalcomment)            {               size_comment = ZREAD(ziinit.z_filefunc, ziinit.filestream,ziinit.globalcomment,size_comment);               ziinit.globalcomment[size_comment]=0;            }        }        byte_before_the_zipfile = central_pos -                                (offset_central_dir+size_central_dir);        ziinit.add_position_when_writting_offset = byte_before_the_zipfile;        {            uLong size_central_dir_to_read = size_central_dir;            size_t buf_size = SIZEDATA_INDATABLOCK;            void* buf_read = (void*)ALLOC(buf_size);            if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,                  offset_central_dir + byte_before_the_zipfile,                  ZLIB_FILEFUNC_SEEK_SET) != 0)                  err=ZIP_ERRNO;            while ((size_central_dir_to_read>0) && (err==ZIP_OK))            {                uLong read_this = SIZEDATA_INDATABLOCK;                if (read_this > size_central_dir_to_read)                    read_this = size_central_dir_to_read;                if (ZREAD(ziinit.z_filefunc, ziinit.filestream,buf_read,read_this) != read_this)                    err=ZIP_ERRNO;                if (err==ZIP_OK)                    err = add_data_in_datablock(&ziinit.central_dir,buf_read,                                                (uLong)read_this);                size_central_dir_to_read-=read_this;            }            TRYFREE(buf_read);        }        ziinit.begin_pos = byte_before_the_zipfile;        ziinit.number_entry = number_entry_CD;        if (ZSEEK(ziinit.z_filefunc, ziinit.filestream,                  offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)            err=ZIP_ERRNO;    }    if (globalcomment)    {      *globalcomment = ziinit.globalcomment;    }#    endif /* !NO_ADDFILEINEXISTINGZIP*/    if (err != ZIP_OK)    {#    ifndef NO_ADDFILEINEXISTINGZIP        TRYFREE(ziinit.globalcomment);#    endif /* !NO_ADDFILEINEXISTINGZIP*/        TRYFREE(zi);        return NULL;    }    else    {        *zi = ziinit;        return (zipFile)zi;    }}extern zipFile ZEXPORT zipOpen (pathname, append)    const char *pathname;    int append;{    return zipOpen2(pathname,append,NULL,NULL);}extern int ZEXPORT zipOpenNewFileInZip3 (file, filename, zipfi,                                         extrafield_local, size_extrafield_local,                                         extrafield_global, size_extrafield_global,                                         comment, method, level, raw,                                         windowBits, memLevel, strategy,                                         password, crcForCrypting)    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;    int windowBits;    int memLevel;    int strategy;    const char* password;    uLong crcForCrypting;{    zip_internal* zi;    uInt size_filename;    uInt size_comment;    uInt i;    int err = ZIP_OK;#    ifdef NOCRYPT    if (password != NULL)        return ZIP_PARAMERROR;#    endif    if (file == NULL)        return ZIP_PARAMERROR;    if ((method!=0) && (method!=Z_DEFLATED))        return ZIP_PARAMERROR;    zi = (zip_internal*)file;    if (zi->in_opened_file_inzip == 1)    {        err = zipCloseFileInZip (file);        if (err != ZIP_OK)            return err;    }    if (filename==NULL)        filename="-";    if (comment==NULL)        size_comment = 0;    else        size_comment = (uInt)strlen(comment);    size_filename = (uInt)strlen(filename);    if (zipfi == NULL)        zi->ci.dosDate = 0;    else    {        if (zipfi->dosDate != 0)            zi->ci.dosDate = zipfi->dosDate;        else zi->ci.dosDate = ziplocal_TmzDateToDosDate(&zipfi->tmz_date,zipfi->dosDate);    }    zi->ci.flag = 0;    if ((level==8) || (level==9))      zi->ci.flag |= 2;    if ((level==2))      zi->ci.flag |= 4;    if ((level==1))      zi->ci.flag |= 6;    if (password != NULL)      zi->ci.flag |= 1;    zi->ci.crc32 = 0;    zi->ci.method = method;    zi->ci.encrypt = 0;    zi->ci.stream_initialised = 0;    zi->ci.pos_in_buffered_data = 0;    zi->ci.raw = raw;    zi->ci.pos_local_header = ZTELL(zi->z_filefunc,zi->filestream) ;    zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename +                                      size_extrafield_global + size_comment;    zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader);    ziplocal_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);    /* version info */    ziplocal_putValue_inmemory(zi->ci.central_header+4,(uLong)VERSIONMADEBY,2);    ziplocal_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);    ziplocal_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);    ziplocal_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);    ziplocal_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);    ziplocal_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/    ziplocal_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/    ziplocal_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/    ziplocal_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);    ziplocal_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);    ziplocal_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);    ziplocal_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/    if (zipfi==NULL)        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);    else        ziplocal_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);    if (zipfi==NULL)        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);    else        ziplocal_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);    ziplocal_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header- zi->add_position_when_writting_offset,4);    for (i=0;i<size_filename;i++)        *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);    for (i=0;i<size_extrafield_global;i++)        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =              *(((const char*)extrafield_global)+i);    for (i=0;i<size_comment;i++)        *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+

⌨️ 快捷键说明

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