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. 老程序员解Bug的通用套路

    千万不要当程序员面说有bug 对于新手程序员而言,在复杂代码中找BUG是一个难点.下面我们总结下老从程序员解Bug的通用套路,希望对大家有帮助. 1.IDE调试 根据项目特点和语言特点选择一个最合适的 ...

  2. 【转】C#、面向对象、设计模式学习

    源地址:http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html

  3. C# Winform下一个热插拔的MIS/MRP/ERP框架(多语言方案)

    个别时候,我们需要一种多语种切换方案. 我的方案是这样的: 1.使用文本文本存储多语言元素,应用程序启动时加载到内存表中: 2.应用程序启动时从配置文件加载语种定义: 3.所有窗体继承自一个Base基 ...

  4. spring 学习(三):aop 学习

    spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...

  5. 选择排序 思想 JAVA实现

    已知一个数组 9.29.95.47.79.37.18.56.96.22 使用选择排序是数组有序 选择排序同样是一个运行时间为O(N²)的排序算法. 算法思想:(以从小到大为例) 9.29.95.47. ...

  6. bootstrap的其他

    情境文本颜色 <p class="text-muted">...</p> <p class="text-primary">. ...

  7. php中magic_quotes_gpc的作用 解决日文数据提交后多出来反斜杠的问题

    magic_quotes_gpc发生作用是在传递$_GET,$_POST,$_COOKIE时 1.条件: magic_quotes_gpc=off写入数据库的字符串未经过任何过滤处理.从数据库读出的字 ...

  8. 【转】nginx在Windows系统启动不了

    这几天用到Nginx,第一次是win7系统下部署,一次性成功,第二次在win10系统下,部署失败. 出现的情况: 打开Nginx.exe,界面一闪而过,而且进程里面搜不到Nginx. 1.端口占用问题 ...

  9. checkstyle 各标签 (有几个没翻译,不懂意思)

    以下是对checkstyle 7.8.1 version各标签的翻译,有少数几个标签没翻译,不太懂官网的意思,就空了,希望游客能帮忙补充补充,另外有错的话也希望大家留言下哈,另外转载的话请标明一下 1 ...

  10. js 获取 屏幕 可用高度...

    document.documentElement.clientWidth 此方法适用于手机... document.documentElement.clientHeight (浏览器(手机或电脑)可用 ...