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. php代码审计5审计命令执行漏洞

    命令执行漏洞:通过易受攻击的应用程序在主机操作系统上执行任意命令,用户提供的数据(表单,cookie,http头等)未过滤 挖掘思路:用户能够控制函数输入,存在可执行代码的危险函数 命令执行和代码执行 ...

  2. 【spring源码】bean的实例化(转载)

    首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. 上一节介绍了Sp ...

  3. PEP 8 – Style Guide for Python Code

    原文:PEP 8 – Style Guide for Python Code PEP:8 题目:Python代码风格指南 作者:Guido van Rossum, www.yszx11.cnBarry ...

  4. centos安装mysql57

    下载源安装文件 https://dev.mysql.com/downloads/repo/yum/ wget http://repo.mysql.com//mysql57-community-rele ...

  5. 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...

  6. Android SharedPreferences应用实例(记录App的使用次数)

    1.介绍 2.使用方法 3.java后台 package com.lucky.test46sharedpreferences_apply; import android.content.SharedP ...

  7. C++_异常5-异常规范和栈解退

    异常规范 异常规范的理念看似有前途,但实际的使用效果并不好. 忽视异常规范之前,您至少应该知道它是什么样的,如下所示: double harm(double a) throw(bad_thing);  ...

  8. HDU - 2276 位运算矩阵快速幂

    挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...

  9. python--交互器,编译器

    1在写python的时候调交互器的作用 唯一作用:调试代码 2.编译器

  10. Android系统概述

    一.Android的诞生 Android这一词最先出现在法国作家利尔亚当在1886年发表的科幻小说<未来夏娃>中,作者将外表像人类的机器起名为Android,这也就是Android小人名字 ...