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 这个
- 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 ...
- libz.so库分析
from:http://blog.chinaunix.net/uid-12773189-id-84605.html 1.查看库文件是由哪个软件包提供的空闲时打开/usr/lib目录(因为我知道这个目录 ...
- 编译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 ...
- libz.dylib
1. .dylib意味着这是一个动态链接库. 2. libz.dylib是提供zip压缩解压缩的库
- 使用LibZ合并.Net程序集,支持WPF
最近写了一个小的WPF程序,发布的时候发现依赖着两三个20~30k的小dll的,感觉有点不爽,就想把它合并一下.以前在WinForm下用过微软的ILMerge合并程序集,不过记得它对WPF程序支持不大 ...
- ios 9.1以后 添加libz.dylib 方法
1. 进入你项目的build phases 2.点击+号在弹出的对话框选择addother 3.在弹出的对话框中输入"cmd"+"shift"+"g& ...
- iOS开发libz.dylib介绍
libz.dylib这个Xcode系统库文件经常用到.这个其实是个动态链接库. 后缀名为.dylib的文件是一个动态库,这个库是运行时加载而不是编译时加载.这个也说明了obj-C是运行时语言,也就是数 ...
- xcode 编译错误找不到 libz.dylib
图片对应的是libxml2.dylib (libz.dylib 遇到的编译错误跟这个类似) 解决方法是在引入库的地方调整原先 比如libz.dylib 的目录: ================== ...
- /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 ...
随机推荐
- Charles设置可抓https的包
一.help 二.proxy
- PAT1002 写出这个数 (C++实现)
PAT乙级考试题目 1002 写出这个数 (20 分) 题目要求: 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字. 输入格式: 每个测试输入包含 1 个测试用例,即给出自然数 ...
- javascript jquery console调试方法说明
控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示 ...
- 微信小程序之页面之间传递值
页面之间传值有三种方式 1.url传值 2.本地存储传值 3.全局变量传值 1.url传值: 通过url传值的需要通过option来获取参数值. 更多详情可以访问小程序-navigateTo章节. A ...
- 使用navicat将mysql转换成sqlserver
使用navicat将mysql转换成sqlserver 1. 打开navicat,连接所需要装换的mysql数据库. 2. 选择所需要转换的数据源,点击右键选择数据传输.如图: 3. 打开数据传输面板 ...
- java 连接 Redis
使用 jedis-2.9.0.jar 包 连接 Docker 中的 Redis 容器. package redisTest; /** * @Author:YangLianjun * @Descript ...
- 给JFinal添加 Sqlite 数据库支持
[转自] http://my.oschina.net/u/237078/blog/69934 Sqlite 的单文件便携性.高性能在开发中方便性无与伦比,即使部署在中小型应用中也胜任有余. 在JFin ...
- 剑指offer——面试题14:剪绳子
// 面试题14:剪绳子 // 题目:给你一根长度为n绳子,请把绳子剪成m段(m.n都是整数,n>1并且m≥1). // 每段的绳子的长度记为k[0].k[1].…….k[m].k[0]*k[1 ...
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- IOS下去掉input submit圆角和背景色错误
在iOS系统下input submit会有圆角,如果添加有背景色,背景色错误,在安卓系统是没有这些问题,可以在input样式加上这段样式 input{ -webkit-appearance: none ...