libtar 和 libz 的使用


用c代码生成 tar.gz 文件  实现的功能和 tar -zcf 命令一样

大概流程为
1、先用libtar相关函数对某个目录生成tar文件
2、然后对tar文件进行压缩

//tarFile  -- like /home/user/test.tar
int tb_comparss_dir(char* srcDir, char* tarFile)
{
    TAR            *pTar;
    char        extractTo[] = ".";
    char        desFile[FILE_PATH_LEN] = { 0 };
    char        szBuf[10000] = { 0 };
    ssize_t        read_len;
    FILE*        tarFd;
    gzFile        gzFd;
    memset(desFile, 0, sizeof(desFile));
    sprintf(desFile, "%s.gz", tarFile);
    if (tar_open(&pTar, tarFile, NULL, O_WRONLY | O_CREAT, 0644, TAR_GNU) < 0)
    {
        xlog_error(__FILE__, __LINE__, "tar_open[%s] error[%s]", tarFile, strerror(errno));
        return -1;
    }
    if (tar_append_tree(pTar, srcDir, extractTo) < 0)
    {
        close(tar_fd(pTar));
        xlog_error(__FILE__, __LINE__, "tar_append_tree error[%s]", strerror(errno));
        return -1;
    }
    close(tar_fd(pTar));
    tarFd = fopen(tarFile, "rb");
    if (tarFd == NULL) {
        xlog_error(__FILE__, __LINE__, "fopen[%s] error[%s]", tarFile, strerror(errno));
        return -1;
    }
    gzFd = gzopen(desFile, "wb");
    if (gzFd == NULL) {
        fclose(tarFd);
        remove(tarFile);
        fprintf(stderr, "gzopen error\n");
        xlog_error(__FILE__, __LINE__, "gzopen[%s] error[%s]", tarFile, strerror(errno));
        return -1;
    }
    while ((read_len = fread(szBuf, 1, 10000, tarFd)) > 0)
    {
        gzwrite(gzFd, szBuf, read_len);
    }
    gzclose(gzFd);
    fclose(tarFd);
    remove(tarFile);
    return 0;

}  



以上代码进行压缩某个目录,参数srcDir为要打包压缩的某个目录,tarFile 为要打包的文件名(.tar 结尾) 生成的文件最后未.tar.gz


解压缩和压缩过程相反,先解压,再解包

//uncomparss to srcDir
int tb_uncomparss_dir(char* srcDir, char* tarFile)
{
    gzFile        gzFd;
    char        szTmpFile[FILE_PATH_LEN] = { 0 };
    FILE        *fp;
    int            nReadLen = 0;
    char        szBuf[10000] = { 0 };
    TAR*        pTar;
    if (strstr(tarFile, "tar.gz") == NULL)
    {
        xlog_error(__FILE__, __LINE__, "file[%s] is not end with .tar.gz", tarFile);
        return -1;
    }
    if (access(tarFile, F_OK) < 0)
    {
        xlog_error(__FILE__, __LINE__, "not find file[%s]", tarFile);
        return -1;
    }
    gzFd = gzopen(tarFile, "rb");
    if (gzFd == NULL)
    {
        xlog_error(__FILE__, __LINE__, "gzopen file[%s] err[%s]", tarFile, strerror(errno));
        return -1;
    }
    memset(szTmpFile, 0, sizeof(szTmpFile));
    memcpy(szTmpFile, tarFile, strlen(tarFile) - 3);        //remove .gz
    fp = fopen(szTmpFile, "wb");
    if (fp == NULL)
    {
        gzclose(gzFd);
        xlog_error(__FILE__, __LINE__, "open file[%s] err[%s]", szTmpFile, strerror(errno));
        return -1;
    }
    while ((nReadLen = gzread(gzFd, szBuf, 10000)) > 0)
    {
        fwrite(szBuf, nReadLen, 1, fp);
    }
    gzclose(gzFd);
    fclose(fp);
    if (tar_open(&pTar, szTmpFile, NULL, O_RDONLY, 0644, TAR_GNU) < 0)
    {
        unlink(szTmpFile);
        xlog_error(__FILE__, __LINE__, "tar_open[%s] error[%s]", szTmpFile, strerror(errno));
        return -1;
    }
    if (tar_extract_all(pTar, srcDir) < 0)
    {
        tar_close(pTar);
        unlink(szTmpFile);
        xlog_error(__FILE__, __LINE__, "tar_extract_all error[%s]", strerror(errno));
        return -1;
    }
    tar_close(pTar);
    unlink(szTmpFile);
    return 0;

}  



请主动忽略 xlog_error()函数
其中makefile 中需要添加动态库   -ltar  -lz  
libtar.so 可以用yum安装 libtar-devel 这个

libtar 和 libz 的使用的更多相关文章

  1. Ubuntu12.04安装64位系统出现编译错误error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or dir

    问题: Ubuntu12.04安装64位系统出现编译错误error while loading shared libraries: libz.so.1: cannot open shared obje ...

  2. libz.so库分析

    from:http://blog.chinaunix.net/uid-12773189-id-84605.html 1.查看库文件是由哪个软件包提供的空闲时打开/usr/lib目录(因为我知道这个目录 ...

  3. 编译Uboot时提示error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory

    在Ubuntu14.04 64位系统中已经安装了libc6:i386的库,编译Uboot时提示error while loading shared libraries: libz.so.1: cann ...

  4. libz.dylib

    1. .dylib意味着这是一个动态链接库. 2. libz.dylib是提供zip压缩解压缩的库

  5. 使用LibZ合并.Net程序集,支持WPF

    最近写了一个小的WPF程序,发布的时候发现依赖着两三个20~30k的小dll的,感觉有点不爽,就想把它合并一下.以前在WinForm下用过微软的ILMerge合并程序集,不过记得它对WPF程序支持不大 ...

  6. ios 9.1以后 添加libz.dylib 方法

    1. 进入你项目的build phases 2.点击+号在弹出的对话框选择addother 3.在弹出的对话框中输入"cmd"+"shift"+"g& ...

  7. iOS开发libz.dylib介绍

    libz.dylib这个Xcode系统库文件经常用到.这个其实是个动态链接库. 后缀名为.dylib的文件是一个动态库,这个库是运行时加载而不是编译时加载.这个也说明了obj-C是运行时语言,也就是数 ...

  8. xcode 编译错误找不到 libz.dylib

    图片对应的是libxml2.dylib  (libz.dylib 遇到的编译错误跟这个类似) 解决方法是在引入库的地方调整原先 比如libz.dylib 的目录: ================== ...

  9. /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux)

    /usr/local/lib/libz.a: could not read symbols: Bad value(64 位 Linux) /usr/bin/ld: /usr/local/lib/lib ...

随机推荐

  1. 【转】C#日期时间格式化

    源地址:https://www.cnblogs.com/polk6/p/5465088.html

  2. c++多线程基础5(future,async,packaged_task,promise)

    以下内容整理自:https://www.cnblogs.com/my_life/articles/5401190.html future 是一个能从其他地方获取到一个值的对象,如果是在不同的线程中,则 ...

  3. DOS远程桌面连接命令[佚名]

    DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console cmd 运行 command 删除文件 rd 文件名/S 创建文件 MD 文件名 net user admin ...

  4. SDUT OJ 数据结构实验之排序四:寻找大富翁

    数据结构实验之排序四:寻找大富翁 Time Limit: 200 ms Memory Limit: 512 KiB Submit Statistic Discuss Problem Descripti ...

  5. SDUT OJ 数据结构实验之排序八:快速排序

    数据结构实验之排序八:快速排序 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description 给定N ...

  6. redis incr自增指定的无限期 key 删除问题

    不得不说,最近在使用redis的incr的功能的时候,着实是踩了不少的坑啊! 前面我写的一篇文章里面,我提到通过incr产生的键在用普通的get的方式去获取的时候,是获取不到的,所以我不得不通过特殊的 ...

  7. bootstrap表单控件

    禁用状态: 被禁用的 fieldset 为<fieldset> 设置 disabled 属性,可以禁用 <fieldset> 中包含的所有控件. <form> &l ...

  8. SSM整合dubbo 进行分页查询

    1.先书写Mapper和sql语句 public interface ActEntityMapper { int deleteByPrimaryKey(String actId); int inser ...

  9. rest-assured的根路径(root path)和URL编码(URL Encoding)

    一.根路径(Root path) 为了避免在body方法中使用重复的路径来断言,我们可以指定一个根路径(root path),比如: 我们以前的写法是: when(). get("/some ...

  10. LOJ6502. 「雅礼集训 2018 Day4」Divide(构造+dp)

    题目链接 https://loj.ac/problem/6502 题解 中间一档部分分提示我们将所有的 \(w_i\) 排序. 考虑如果我们能构造出这样一个 \(w_i\) 的序列,使得该序列满足:对 ...