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 ...
随机推荐
- 老程序员解Bug的通用套路
千万不要当程序员面说有bug 对于新手程序员而言,在复杂代码中找BUG是一个难点.下面我们总结下老从程序员解Bug的通用套路,希望对大家有帮助. 1.IDE调试 根据项目特点和语言特点选择一个最合适的 ...
- 【转】C#、面向对象、设计模式学习
源地址:http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html
- C# Winform下一个热插拔的MIS/MRP/ERP框架(多语言方案)
个别时候,我们需要一种多语种切换方案. 我的方案是这样的: 1.使用文本文本存储多语言元素,应用程序启动时加载到内存表中: 2.应用程序启动时从配置文件加载语种定义: 3.所有窗体继承自一个Base基 ...
- spring 学习(三):aop 学习
spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...
- 选择排序 思想 JAVA实现
已知一个数组 9.29.95.47.79.37.18.56.96.22 使用选择排序是数组有序 选择排序同样是一个运行时间为O(N²)的排序算法. 算法思想:(以从小到大为例) 9.29.95.47. ...
- bootstrap的其他
情境文本颜色 <p class="text-muted">...</p> <p class="text-primary">. ...
- php中magic_quotes_gpc的作用 解决日文数据提交后多出来反斜杠的问题
magic_quotes_gpc发生作用是在传递$_GET,$_POST,$_COOKIE时 1.条件: magic_quotes_gpc=off写入数据库的字符串未经过任何过滤处理.从数据库读出的字 ...
- 【转】nginx在Windows系统启动不了
这几天用到Nginx,第一次是win7系统下部署,一次性成功,第二次在win10系统下,部署失败. 出现的情况: 打开Nginx.exe,界面一闪而过,而且进程里面搜不到Nginx. 1.端口占用问题 ...
- checkstyle 各标签 (有几个没翻译,不懂意思)
以下是对checkstyle 7.8.1 version各标签的翻译,有少数几个标签没翻译,不太懂官网的意思,就空了,希望游客能帮忙补充补充,另外有错的话也希望大家留言下哈,另外转载的话请标明一下 1 ...
- js 获取 屏幕 可用高度...
document.documentElement.clientWidth 此方法适用于手机... document.documentElement.clientHeight (浏览器(手机或电脑)可用 ...