C++ 解压缩文件

 

  使用方法:

   创建压缩文件。可以指定压缩的文件保存在什么地方

//压缩文件路径和压缩文件名字,如:d:\\file.zip
    string zip_file_name = dest_zip_dir + "\\" + zip_name;
    TCHAR* t_zip_file_name = mystring.StringToPTCHAR(zip_file_name);
    hz = CreateZip(t_zip_file_name, 0);    


ZipAddFolder 添加文件夹。

ZipAddFolder(hz, _T("format\\label"));
    ZipAdd(hz, _T("format\\label\\barcode1.fmt"), _T("E:\\ProgramTest\\TScale_11DLLApplicationSample\\Debug\\ts_set\\format\\label\\barcode1.fmt"));
    CloseZip(hz);

 

 

1.使用原文

http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win?fid=68674&select=4369563&fr=301#xx0xx

 

2.建立控制台引用的时候会出现这样的错误"C2065:'HZIP': undeclared identifier“。

  是因为控制台程序没添加#include<window.h>   ,而且还要添加到zip.h前面。

 

3.原来解压缩中文名字的文件会有乱码,已被我修改好。

//by likewei comment out  压缩中文名字有乱码的问题
//#ifdef UNICODE
//  WideCharToMultiByte(CP_UTF8,0,dstzn,-1,zfi.iname,MAX_PATH,0,0);
//#else
//  strcpy(zfi.iname,dstzn);
//#endif
//end comment out



  //by likewei add
  //TCHAR*  -> char*
  int tchar_len = wcslen(dstzn);    
  char *char_back = new char[tchar_len];    
  int byte_len = WideCharToMultiByte(CP_ACP, 0, dstzn, tchar_len, NULL, 0, NULL, NULL); 
  WideCharToMultiByte(CP_ACP, 0, dstzn, tchar_len + 1, char_back, byte_len + 1, NULL, NULL); 
  //char*-> char[]
  strcpy(zfi.iname,char_back);
  //end add

 

// zibtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <vector>
#include <string>
#include "zip.h"
#include "unzip.h"
//string->TCHAR*
TCHAR *StringToTcharP(std::string str)
{
    //string ->  char*
    char* p_char=const_cast<char*>(str.c_str());

    //char* -> Tchar*
    int nLen = strlen(p_char) + 1;  
    int nwLen = MultiByteToWideChar(CP_ACP,0,p_char,nLen,NULL, 0); 
    //TCHAR p_tchar[256] 会乱码,更换成以下就好了
    TCHAR * p_tchar=new TCHAR[256];
    MultiByteToWideChar(CP_ACP, 0,p_char,nLen,p_tchar,nwLen);  

    return p_tchar;

}
int _tmain(int argc, _TCHAR* argv[])
{
    HZIP hz; DWORD writ;
    std::string zip_file_name="E:\\Projects\\zlibTest2\\ziptestfile\\中国2.zip";

    TCHAR *tchar_zip_file_name=StringToTcharP(zip_file_name);
    //hz = CreateZip(_T("E:\\Projects\\zlibTest2\\ziptestfile\\中国2.zip"),0);
    hz = CreateZip(tchar_zip_file_name,0);
    delete[]tchar_zip_file_name;

    //压缩文件
    ZipAdd(hz,_T("中国.bmp"), _T("E:\\Projects\\zlibTest2\\ziptestfile\\中国.bmp"));
    ZipAdd(hz,_T("abc中国.bmp"), _T("E:\\Projects\\zlibTest2\\ziptestfile\\abc中国.bmp"));    
    CloseZip(hz);

    //解压缩
    hz = OpenZip(_T("d:\\product_add_20150407111948.zip"),0);
    SetUnzipBaseDir(hz,_T("d:\\"));
    ZIPENTRY ze; 
    GetZipItem(hz,-1,&ze); 
    int numitems=ze.index;
    for (int zi=0; zi<numitems; zi++)
    { GetZipItem(hz,zi,&ze);
    UnzipItem(hz,zi,ze.name);
    }
    CloseZip(hz);


    printf("zip is ok!");
    system("pause");
    return 0;
}

 

压缩文件夹

 

int HaveSonDirectory(string source_dir)
{
    string search_file_dir = source_dir + "\\*.*";
    _finddata_t fileInfo;
    long handle = _findfirst(search_file_dir.c_str(), &fileInfo);
    if (handle == -1L)
    {
        /*is_continue_search = false;*/
        //return "failed to transfer files";
        _findclose(handle);
        return -1;
    }

    string file_name;
    do
    {
        file_name = fileInfo.name;
        //判断是文件夹
        if (fileInfo.attrib& _A_SUBDIR)
        {

            if (file_name.compare(0, 1, ".") != 0)
            {
                _findclose(handle);
                return 0;

            }

        }


    } while (_findnext(handle, &fileInfo) == 0);

    _findclose(handle);
    return -2;

}

int AddDirectoryToZip(HZIP& hz, string zip_name, string source_zip_dir,string current_zip_dir)
{


    CMyString mystring;

    string file_name;
    string new_file_dir;
    string search_file_dir = source_zip_dir + "\\*.*";


    TCHAR* t_add_floder;

    TCHAR* t_zip_add_name;
    TCHAR* t_zip_add_name_path;


    _finddata_t fileInfo;
    long handle = _findfirst(search_file_dir.c_str(), &fileInfo);
    if (handle == -1L)
    {
        /*is_continue_search = false;*/
        //return "failed to transfer files";
        return 1;
    }


    do 
    {
        file_name = fileInfo.name;
        //判断是文件夹
        if (fileInfo.attrib& _A_SUBDIR)
        {
            
            if (file_name.compare(0, 1, ".") != 0)
            {

                new_file_dir = source_zip_dir + "\\" + file_name;
                current_zip_dir = current_zip_dir+"\\"+ file_name;
                if (HaveSonDirectory(new_file_dir) != 0)
                {                            
                    //没有子目录,最后一层
                    current_zip_dir.erase(0, current_zip_dir.find_first_not_of("\\"));
                    t_add_floder = mystring.StringToPTCHAR(current_zip_dir);

                    ZipAddFolder(hz, t_add_floder);                    
                    delete[] t_add_floder;

                
                }
                AddDirectoryToZip(hz, zip_name, new_file_dir, current_zip_dir);    

                int current_index = current_zip_dir.find("\\");
                if (current_index > 0)
                {
                    current_zip_dir = current_zip_dir.substr(0, current_zip_dir.find_last_of("\\"));
                }
                else
                {
                    current_zip_dir = "";
                }
                
            }

        }
        else
        {
            if (file_name != zip_name)
            {
            
                if (current_zip_dir == "")
                {
                    t_zip_add_name = mystring.StringToPTCHAR(file_name);
                }
                else
                {
                    t_zip_add_name = mystring.StringToPTCHAR(current_zip_dir + "\\" + file_name);
                }
                
                t_zip_add_name_path = mystring.StringToPTCHAR(source_zip_dir + "\\" + file_name);

                ZipAdd(hz, t_zip_add_name, t_zip_add_name_path);
                delete[] t_zip_add_name;
                delete[] t_zip_add_name_path;

            }
            
        }




    } while (_findnext(handle, &fileInfo)==0);
    
    

    _findclose(handle);    
    return 0;

}

//zip_name  压缩文件名字,如:data.zip
//source_zip_dir  要压缩文件的目录 如:d:\\file
//dest_zip_dir    保存压缩文件目录,此目录必须先创建

int CMyFile::AddZipDirectory(string zip_name, string source_zip_dir, string dest_zip_dir)
{

    CMyString mystring;
    HZIP hz;
    //压缩文件路径和压缩文件名字,如:d:\\file.zip
    string zip_file_name = dest_zip_dir + "\\" + zip_name;
    TCHAR* t_zip_file_name = mystring.StringToPTCHAR(zip_file_name);
    hz = CreateZip(t_zip_file_name, 0);        

    string current_zip_dir = "";
    int ret = AddDirectoryToZip(hz, zip_name, source_zip_dir, current_zip_dir);
    delete[] t_zip_file_name;
    CloseZip(hz);    
    return ret;

 

posted @ 2015-03-20 17:03  ike_li  阅读(2501)  评论(0编辑  收藏  举报