压缩与解压缩的实现

参考网址:
开源代码:http://www.zlib.net
zlib使用手册:http://www.zlib.net/manual.html
zlib wince版:http://www.tenik.co.jp/~adachi/wince/
在这里,你可以查看基于各种操作系统平台的压缩与解缩代码实现。

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
以下是经过测试的 WinCE 及 WinXP 下的代码

<<<<<<<<
第一步: 首先到www.zlib.net下载个ZLIB,
             WinXP: 解压缩后打开zlib-1.2.3/projects/visualc6/zlib.dsw,选择Win32 LIB Release 按F7编绎生成zlib.lib, zlib.dll.
            WinCE: 下载一个for Windows CE 版的包,里面针对各种平台(ARM4, ARM4I, MIPS, X86)有对应的zlibce.dll zlibce.lib.

<<<<<<<<
第二步: 建立EVC 或者 VC6 的对话框工程.
             在工程中添加以下文件:zlib.h, zconf.h, zlib.lib, zlib.dll (或者 zlibce.dll);
            这3个文件就在刚才从www.zlib.net下载的软件包中.

<<<<<<<<
第三步: 包含头文件
#include "zlib.h"
#include "StorageDeal.h"
      其中CStorageDeal是我写的文件处理类,功能类似于CFile类。它的类定义如下:
class CStorageDeal : public CStatic
{
     // Construction
     public:
         CStorageDeal();
         virtual ~CStorageDeal();

     // Attributes
     public:
       CFile myFile;
        DWORD myFileLength;
       BOOL FileOpenStaus;

     public:
        BOOL OpenFile(CString pFileName); 
        BOOL CloseFile();

        DWORD ReadBlockData(BYTE *pData, DWORD blockIndex, DWORD idIndex);
      DWORD WriteBlockData(BYTE *pData, DWORD blockIndex, DWORD idIndex);

        DWORD GetFileLength();
        DWORD SetFileLength(DWORD length); 

        DWORD ReadData(BYTE *pData, DWORD position, DWORD length);
      DWORD WriteData(BYTE *pData, DWORD position, DWORD length);

        static BOOL DeleteFile(CString pFileName);
       static BOOL RenameFile(CString pOldName, CString pNewName);
};

<<<<<<<<
第四步: 添加压缩与解压缩代码

压缩代码:
BOOL CMyZip_evcDlg::zip(CString srcFileName, CString dstFileName)
{

#ifdef NO_GZCOMPRESS

    MessageBox(_T("NO_GZCOMPRESS -- gz* functions cannot compress"));

       return FALSE;

#endif

       // 打开待压缩的文件

       CStorageDeal unzipFile;

       unzipFile.OpenFile(srcFileName);

       int fileLen = unzipFile.GetFileLength();

       // 创建压缩文件

    gzFile zipFile;

       CString zipFileName = srcFileName +_T(".gz");

       int zipFileNameLen = zipFileName.GetLength();

#ifdef ARM   // WinCE下代码

       char nameBuff[100]={0};

    WideCharToMultiByte(CP_ACP,0,zipFileName,zipFileNameLen,nameBuff,zipFileNameLen,NULL,NULL);

       zipFile = gzopen(nameBuff, "wb");

#else // WinXP下大妈

       zipFile = gzopen(zipFileName, "wb");

#endif

      

    z_off_t pos;

      

       // 临时变量定义

       BYTE buff[10000]={0};

       int buffLen;

       int BlockSize = sizeof(buff);

       int BlockLeft = fileLen%BlockSize;

       int BlockNum = fileLen/BlockSize;

       if(BlockLeft != 0)

       {

              BlockNum++;

       }

      

       // 开始压缩

       for(int BlockIndex=0;BlockIndex<BlockNum;BlockIndex++)

       {

              if(BlockLeft != 0)

              {

                     if(BlockIndex < BlockNum - 1)

                            buffLen = BlockSize;

                     else

                            buffLen = BlockLeft;

              }

              else

              {

                     buffLen = BlockSize;

              }

             

              unzipFile.ReadData(buff,BlockIndex*BlockSize,buffLen);

             

             

              if (zipFile == NULL)

              {

                     MessageBox(_T("gzopen error/n"));

                     return FALSE;

              }

#ifdef ARM

              gzwrite(zipFile,(voidp)buff,buffLen);

#else

              gzwrite(zipFile,(voidpc)buff,buffLen);

#endif

       }

       gzclose(zipFile);

       unzipFile.CloseFile();

      

       // dest file name is not processed.

       // CFile::Rename(zipFileName,dstFileName);

}


解压缩代码:

BOOL CMyZip_evcDlg::unzip(CString srcFileName, CString dstFileName)

{

       // 打开待解压的文件

    gzFile zipFile;

       CString zipFileName = srcFileName;

       int zipFileNameLen = zipFileName.GetLength();

#ifdef ARM

       char nameBuff[100]={0};

    WideCharToMultiByte(CP_ACP,0,zipFileName,zipFileNameLen,nameBuff,zipFileNameLen,NULL,NULL);

       zipFile = gzopen(nameBuff, "rb");

#else

       zipFile = gzopen(zipFileName, "rb");

#endif

      

    if (zipFile == NULL) {

        MessageBox(_T("gzopen error"));

              return FALSE;

    }

       // 创建文件

       CStorageDeal unzipFile;

       dstFileName = srcFileName;

       dstFileName.TrimRight(_T(".gz"));

      

       unzipFile.OpenFile(dstFileName);

       unzipFile.SetFileLength(0);

      

       // 临时变量

       BYTE buff[1000]={0};

       int buffLen = sizeof(buff);

      

       // 开始解压

       int len;

       int pos = 0;

       while(1)

       {

              len = gzread(zipFile, (voidp)buff,buffLen);

              if(len==0) break;

             

              unzipFile.WriteData(buff,pos,len);

              pos += len;

       }

       gzclose(zipFile);

       unzipFile.CloseFile();

}

 

<<<<<<<<
第五步: 调用压缩与解压缩代码

void CMyZIP_vc6Dlg::OnButton1()

{

       zip(_T("d://aa.doc"),_T("aa.doc.gz"));  
}

void CMyZIP_vc6Dlg::OnButton2()

{

       unzip(_T("d://aa.doc.gz"),_T("aa.doc"));

}

 

<<<<<<<<

posted @ 2010-03-08 16:05  张兴业  阅读(326)  评论(0编辑  收藏  举报