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 ...
随机推荐
- php代码审计9审计反序列化漏洞
序列化与反序列化:序列化:把对象转换为字节序列的过程称为对象的序列化反序列化:把字节序列恢复为对象的过程称为对象的反序列化 漏洞成因:反序列化对象中存在魔术方法,而且魔术方法中的代码可以被控制,漏洞根 ...
- 接口测试简单介绍、及jmeter的简单使用
1.接口测试简单介绍 接口测试其实就是功能测试,是从数据库查询到数据,返回查询结果 接口返回的数据都是json,json是一种通用的数据类型. 接口测试的优点:能在稍微偏底层的地方发现bug,越底层发 ...
- 解决双击dwg文件ARX自定义实体提示代理的问题
双击dwg文件的时候,如果没有通过注册表设置会提示代理实体. 注册表自动加载arx 注册表参考路径 R18.1 是cad版本 ACAD-9001:409 是cad的地区语言,409是英文 ,804是中 ...
- 【spring源码】spring web 启动与关闭
web.xml中有这么一段声明 <context-param> <param-name>contextConfigLocation</param-name> < ...
- 线性可分SVM完全推导过程
- IPython&Jupyter私房手册
Jupyter是以Ipython为基础,可以极大的方便开发,对于如何使用,网上的资料都不太全.因此决定自己编写一个私房手册方便随时查找. 1. 安装和配置 安装不多说,不想折腾直接安装anaconda ...
- HDU-1431-素数回文(暴力打表)
素数回文 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- SDUT OJ 数据结构实验之排序一:一趟快排
数据结构实验之排序一:一趟快排 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- 在Discuz X 中增加一个单独的页面
如果在DZ中增加一个新的页面,并且取得DZ中相关的用户等乱七八糟的属性,在旧的版本中只要引用一个 -. comm.php 文件就可以,但是在 X 版本以后好像就没.还好,X版本中还是有办法解决的,使用 ...
- HDU - 5997 树状数组+set
和之前一道省选题目很像: (梦幻布丁): 我们维护的时候用树状数组维护,在断电处打上标记: 合并的时候小的合并到大的里面: #include<iostream> #include<c ...