我有两个文件,比如说a.txt(不是这个格式,我只是为了说明问题举个.txt的例子)和b.txt,那么我想把这两个文件压缩成一个文件保存,用的时候再释放。用VC编写程序,怎么实现?我不是要压缩算法,而是想通过用一个外部工具(VC能够编程调用的),来完成这个功能。有人给我提供了arj.exe这个工具,并用WineExec调用来生成,释放压缩文件,有高人能够给其他提示么?

解决方案 »

  1.   

    这些程序我没有见过,不过ZIP和RAR的压缩算法我以前写过,需要的话可以给你,楼主好运
      

  2.   

    使用微软的FCI/FDI库进行文件压缩
    FCI(File Compression Interface)和FDI(File Decompression Interface)是由微软提供的用于压缩和解压缩的开发包。最大的好处是在WinNT、Win2000、WinXP下系统都提供了相应的API接口。所以,我们的程序不需要额外的压缩库。
    本文附带例程只是给大家展示了一些比较简单的用法,大家可以根据微软提供的文档,自己挖掘其他的更强大功能。
    FCI包括5个API。
    FCICreate 创建 FCI context
    FCIAddFile 向 cabinet 中添加文件
    FCIFlushCabinet 结束当前的 cabinet
    FCIFlushFolder 结束当前的folder 并建立新的 folder
    FCIDestroy 销毁 FCI context
    HFCI DIAMONDAPI FCICreate(
    PERF              perf,        //用于返回错误类型
    PFNFCIFILEPLACED  pfnfiledest, //用在一个文件跨越多个cabinet时
           PFNFCIALLOC       pfnalloc,    //用来分配和释放内存。
           PFNFCIFREE        pfnfree,
           PFNFCIOPEN        pfnopen, //一下6个分别处理文件的创建、读写、
           PFNFCIREAD        pfnread, //关闭、定位以及删除等。
           PFNFCIWRITE       pfnwrite,
           PFNFCICLOSE       pfnclose,
           PFNFCISEEK        pfnseek,
    PFNFCIDELETE      pfndelete,
          PFNFCIGETTEMPFILE pfnfcigtf, //用于产生临时文件名
           PCCAB             pccab, //是一个CCAB结构的指针对压缩文件的详细描述
    //比如:大小、名称、路径等。
    void FAR *        pv            //返回一些context 参数。
    );BOOL DIAMONDAPI FCIAddFile(
    HFCI                 hfci, //由FCICreate创建的context
          char                 *pszSourceFile,//被压缩的文件
          char                 *pszFileName,//此文件在压缩包中的名称
          BOOL                  fExecute,    //解压时文件是否执行
          PFNFCIGETNEXTCABINET  GetNextCab,//创建下一个cabinet时调用,这里忽略
          PFNFCISTATUS          pfnProgress,//周期性的回调函数,可以显示压缩的进度。
          PFNFCIGETOPENINFO     pfnOpenInfo,//打开文件返回文件句柄及属性
         TCOMP                 typeCompress   //压缩的类型
    )BOOL DIAMONDAPI FCIFlushCabinet(
    HFCI                  hfci,          //由FCICreate创建的context
           BOOL                  fGetNextCab, //决定GetNextCab是否被调用
           PFNFCIGETNEXTCABINET  GetNextCab,//当cabinet满的时候调用
           PFNFCISTATUS          pfnProgress //同FCIAddFile
    )BOOL DIAMONDAPI FCIFlushFolder(
    HFCI                  hfci,           //参数同上
    PFNFCIGETNEXTCABINET  GetNextCab,
    PFNFCISTATUS          pfnProgress
    )

    BOOL DIAMONDAPI FCIDestroy(
    HFCI hfci
    )
     二、 FDIFDI包括4个API。
    FDICreate 创建 FDI context
    FDIIsCabinet 判断是否为CAB压缩文件,是则返回其属性
    FDICopy 解压
    FDIDestroy 销毁 FDI context HFCI DIAMONDAPI FDICreate(//参数与FCI相应参数差不多
    PFNALLOC  pfnalloc,
    PFNFREE  pfnfree,
    PFNOPEN  pfnopen,
    PFNREAD  pfnread,
    PFNWRITE  pfnwrite,
    PFNCLOSE pfnclose,
    pfnseek,
    int cpuType,// CPU类型,32位FDI忽略此参数
    PERF perf
    )BOOL DIAMONDAPI FDIIsCabinet(
    HFDI  hfdi,        //FDI context
    int  hf,              //打开的文件句柄
    PFDICABINETINFO  pfdici   //返回压缩文件的一些属性
    )BOOL FAR DIAMONDAPI FDICopy(
    HFDI          hfdi,
    char FAR     *pszCabinet, //待解压文件名
    char FAR     *pszCabPath, //待解压文件的路径
    int           flags,      //保留,现在必须为0
    PFNFDINOTIFY  pfnfdin,    //回调函数,用来处理FDI的通知
    PFNFDIDECRYPT pfnfdid,    //保留,现在必须为NULL
    void FAR     *pvUser      //作为参数传给回调函数pfnfdin,这里设为NULL
    )
      

  3.   

    用过一个压缩库,有源码,编译为dll的,只是一次压缩一个文件而已。
      

  4.   

    char sAppPath[255], sComdLine[1024];
       strcpy(sAppPath,"c:\\arj32.exe", );
      
       sprintf(sComdLine, "%s a c:\\temp.arj c:\\a.txt -y", sAppPath);
      
       unlink("c:\\temp.arj");//如果c:\temp.arj存在,先删除
       WinExec(sComdLine, SW_HIDE);
      

  5.   

    char sAppPath[255], sComdLine[1024];
       strcpy(sAppPath, "c:\\arj32.exe");
       sprintf(sComdLine, "%s e c:\\temp.arj c:\\temppath  -y", sAppPath);
       WinExec(sComdLine, SW_HIDE);
      

  6.   

    调用外部文件压缩也可以啊。安装winrar,其中就有命令行下使用的rar版本。
    把要压缩的文件名写到一个文本类型的文件中,比如backup.lst,其中文件名必须是在第一列,并且可以用//注释,比如:
        c:\work\doc\*.txt         //backup text documents
        c:\work\image\*.bmp       //backup pictures
        c:\work\misc然后用ShellExecute(NULL,"c:\program files\winrar\rar.exe", "a backup @backup.lst", NULL, 0);
      

  7.   

    rar a backup @backup.lst中:
    a                 压缩命令
    backup            目标文件
    @backup.lst       文件名列表文件
      

  8.   

    arj挺好的,当年dos时代我一直用他,不过现在差不多忘了怎么用了,好在它的在线帮助还是比较详细的
      

  9.   

    arj比zip差多了
    又慢又压得少
      

  10.   

    我现在也在做这个,如果大家有关于这方面的资料,能发一份给小弟吗?谢谢![email protected]